如何使用pandas按组计算时间差?

31

问题

我想按组计算diff,但我不知道如何对time列进行排序,以使每个组的结果都是排序和正数。

原始数据:

In [37]: df 
Out[37]:
  id                time
0  A 2016-11-25 16:32:17
1  A 2016-11-25 16:36:04
2  A 2016-11-25 16:35:29
3  B 2016-11-25 16:35:24
4  B 2016-11-25 16:35:46

我想要的结果

Out[40]:
   id   time
0  A   00:35
1  A   03:12
2  B   00:22

注意:时间列的类型为timedelta64 [ns]

尝试中

In [38]: df['time'].diff(1)
Out[38]:
0                 NaT
1            00:03:47
2   -1 days +23:59:25
3   -1 days +23:59:55
4            00:00:22
Name: time, dtype: timedelta64[ns]

没有得到期望的结果。

希望

不仅要解决问题,而且代码要能够快速运行,因为有5000万行。


2
你需要先对数据进行排序 df = df.sort_values(['id','time']),然后才能执行 df.groupby('id')['time'].diff() - EdChum
1个回答

52
你可以使用 sort_valuesgroupby 并聚合 diff
df['diff'] = df.sort_values(['id','time']).groupby('id')['time'].diff()
print (df)
  id                time     diff
0  A 2016-11-25 16:32:17      NaT
1  A 2016-11-25 16:36:04 00:00:35
2  A 2016-11-25 16:35:29 00:03:12
3  B 2016-11-25 16:35:24      NaT
4  B 2016-11-25 16:35:46 00:00:22

如果需要在diff列中删除包含NaT的行,请使用dropna

df = df.dropna(subset=['diff'])
print (df)
  id                time     diff
2  A 2016-11-25 16:35:29 00:03:12
1  A 2016-11-25 16:36:04 00:00:35
4  B 2016-11-25 16:35:46 00:00:22

您还可以覆盖列:

df.time = df.sort_values(['id','time']).groupby('id')['time'].diff()
print (df)
  id     time
0  A      NaT
1  A 00:00:35
2  A 00:03:12
3  B      NaT
4  B 00:00:22

df.time = df.sort_values(['id','time']).groupby('id')['time'].diff()
df = df.dropna(subset=['time'])
print (df)
  id     time
1  A 00:00:35
2  A 00:03:12
4  B 00:00:22

谢谢这个技巧。但是如果我需要在几秒钟内得到结果怎么办?你的答案会返回类似于“0天02:20:25”的东西。 - LeMarque
我使用了这段代码,它起作用了...谢谢Jezrael... df.time = df.sort_values(['id','time']).groupby('id')['time'].diff().dt.total_seconds() - LeMarque

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