在pandas中计算两个相邻行之间的时间差

7
我有一个如下的pandas数据框:
Dev_id     Time
88345      13:40:31
87556      13:20:33
88955      13:05:00
.....      ........
85678      12:15:28

上面的数据框有83000行。我想要计算两个相邻行之间的时间差,并将其保存在一个单独的列中。期望的结果应该是:
Dev_id    Time          Time_diff(in min)
88345      13:40:31      20
87556      13:20:33      15
88955      13:05:00      15

我尝试过df['Time_diff'] = df['Time'].diff(-1),但出现了下面的错误。
TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

如何解决这个问题。

2个回答

14
问题是 pandasdiff 函数需要 datetimetimedelta,因此首先通过 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

如果想要每分钟向下取整 floor 或四舍五入 round,则:
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

难道不可以这样写吗?df['Time_diff'] = (pd.to_timedelta(df['Time'])).diff(-1).dt.floor('T').dt.total_seconds().div(60),我认为我们不需要 astype(str),或者先将 df['Time'] = pd.to_timedelta(df['Time']) 转换,然后再写成 df['Time_Diff'] = df['Time'].diff(-1).dt.total_seconds().div(60)。只是一个想法。 - Karn Kumar
1
@pygo - 问题出在错误 TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time' - 这意味着有时间,没有字符串,所以需要进行转换。为了测试,请使用 df['Time'] = pd.to_datetime(df['Time']).dt.time - jezrael

0
你应该先将df['Time']列转换/强制类型转换为 pd.Timedelta,然后再进行减法运算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接