计算pandas中连续两行之间的时间差

pyt*_*umb 5 python pandas

我有一个熊猫数据框如下

Dev_id     Time
88345      13:40:31
87556      13:20:33
88955      13:05:00
.....      ........
85678      12:15:28
Run Code Online (Sandbox Code Playgroud)

上面的数据帧有 83000 行。我想取连续两行之间的时间差并将其保存在单独的列中。想要的结果是

Dev_id    Time          Time_diff(in min)
88345      13:40:31      20
87556      13:20:33      15
88955      13:05:00      15
Run Code Online (Sandbox Code Playgroud)

我试过了,df['Time_diff'] = df['Time'].diff(-1)但出现如下所示的错误

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题

jez*_*ael 11

问题是函数pandas需要datetimes 或timedeltas diff,所以首先转换 by to_timedelta,然后得到total_seconds并除以60

df['Time_diff'] = pd.to_timedelta(df['Time'].astype(str)).diff(-1).dt.total_seconds().div(60)
#alternative
#df['Time_diff'] = pd.to_datetime(df['Time'].astype(str)).diff(-1).dt.total_seconds().div(60)
print (df)
   Dev_id      Time  Time_diff
0   88345  13:40:31  19.966667
1   87556  13:20:33  15.550000
2   88955  13:05:00  49.533333
3   85678  12:15:28        NaN
Run Code Online (Sandbox Code Playgroud)

如果想要floorround每分钟:

df['Time_diff'] = (pd.to_timedelta(df['Time'].astype(str))
                     .diff(-1)
                     .dt.floor('T')
                     .dt.total_seconds()
                     .div(60))
print (df)
   Dev_id      Time  Time_diff
0   88345  13:40:31       19.0
1   87556  13:20:33       15.0
2   88955  13:05:00       49.0
3   85678  12:15:28        NaN
Run Code Online (Sandbox Code Playgroud)