如何使用熊猫按组计算时差?

Posted

技术标签:

【中文标题】如何使用熊猫按组计算时差?【英文标题】:How to calculate time difference by group using pandas? 【发布时间】:2017-04-09 19:29:19 【问题描述】:

问题

我想按组计算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

注意:时间col的类型是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 万行。

【问题讨论】:

你需要先对数据进行排序df = df.sort_values(['id','time']),然后才能做到df.groupby('id')['time'].diff() 【参考方案1】:

您可以将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

【讨论】:

以上是关于如何使用熊猫按组计算时差?的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中按组顺序计算差异

熊猫:按组计算唯一的日期时间值会给出奇怪的值

如何使用熊猫来加快这个嵌套循环的速度?

在大熊猫DataFrame中按组删除异常值的更快方法[重复]

如何计算PHP中的时差? [复制]

熊猫的负时差