如何减去数据框中每对行的日期,并使用Python将其保存在excel中

如何减去数据框中每对行的日期,并使用Python将其保存在excel中,python,pandas,datetime,Python,Pandas,Datetime,我需要计算两个日期之间的差异,但我需要对每对行进行计算,然后将其保存在excel文件中,例如: df: B 0 2018-02-11 12:14:25 #1st row 1 2018-02-11 12:15:30 #2nd row 2 2018-02-11 12:15:54 #3rd row 3 2018-02-11 12:16:11 #4th row 我的程序需要从第一

我需要计算两个日期之间的差异,但我需要对每对行进行计算,然后将其保存在excel文件中,例如:

df:

  B
0 2018-02-11 12:14:25                #1st row
1 2018-02-11 12:15:30                #2nd row
2 2018-02-11 12:15:54                #3rd row
3 2018-02-11 12:16:11                #4th row
我的程序需要从第一行减去第二行,从第三行减去第四行

这是我目前的代码:

import pandas as pd

df = pd.read_excel('test.xlsx',header=0, index= False)
sub ='chan_avail'
df["Indexes"]= df["A"].str.find(sub) 
df["B"]=df['Time'].where(df['Indexes'] == 0)
df1 = df.dropna(subset=['B'])
#print(df1)
df2 = df1.reset_index(drop=True, inplace=True)
df1['B'] = pd.to_datetime(df1['B'])

#print(df1)
xx=len(df1.index)
for i in range(xx):
    if i % 2 == 0:
        print('!!') #test
        df1['diffB'] = df1['B'] - df1['B'].shift(-1)
print(df1)
df1.to_excel('output.xlsx', 'Sheet1', index=True)  
我打算做的是,如果索引是pair,则计算行之间的差异,但它不起作用。 另外,当我试图在excel中保存时间差时,我得到了0,但在python控制台中我得到了正确的值,但是如果我将
df1['diffB']=pd.to_datetime(df1['diffB'])
添加到datetime,我会得到错误的结果


谢谢您的帮助。

您可以对奇数和偶数值进行切片,并将一个序列转换为numpy数组,以避免对齐-这意味着为了正确进行减法,必须将两个或一个序列中的相同索引值转换为数组:

df['B'] = pd.to_datetime(df['B'])

df['diffB'] = df['B'].iloc[1::2] - df['B'].iloc[::2].to_numpy()
print (df)
                    B    diffB
0 2018-02-11 12:14:25      NaT
1 2018-02-11 12:15:30 00:01:05
2 2018-02-11 12:15:54      NaT
3 2018-02-11 12:16:11 00:00:17
或:

如果行数也是奇数,则解决方案有效:

df['B'] = pd.to_datetime(df['B'])
df['diffB'] = df.groupby(np.arange(len(df)) // 2)['B'].shift(-1) - df['B']
print (df)
                    B    diffB
0 2018-02-11 12:14:25 00:01:05
1 2018-02-11 12:15:30      NaT
2 2018-02-11 12:15:54 00:00:17
3 2018-02-11 12:16:11      NaT

非常感谢您的帮助,但如果您能向我解释一下iloc[1::2]的意思,因为我需要在包含n的数据帧中应用它rows@A.khou-和普林西比一样,只为熊猫添加了
iloc
。如果我的数据帧的长度是奇数,我会得到value错误:无法添加长度不等的索引。我尝试这样做:
a=len(df1.index)如果a%2==0:I在范围内(a):df['diffB']=df['B'].iloc[1::2]。to_numpy()-df['B'].iloc[:2]elif a%2==1:I在范围内(a):df['diffB']=df['B'].iloc[2::].to_numpy()-df['B'].iloc[::2]
但它没有work@A.khou-替代解决方案如何工作
df['diffB']=df.groupby(np.arange(len(df))//2]['B'].diff().shift(-1)
?如果可能,删除
shift
df['diffB']=df.groupby(np.arange(len(df))//.2)['B'].shift(-1)-df'B']
df['B'] = pd.to_datetime(df['B'])
df['diffB'] = df.groupby(np.arange(len(df)) // 2)['B'].shift(-1) - df['B']
print (df)
                    B    diffB
0 2018-02-11 12:14:25 00:01:05
1 2018-02-11 12:15:30      NaT
2 2018-02-11 12:15:54 00:00:17
3 2018-02-11 12:16:11      NaT