如何使用Pandas作为字符串计算事件的持续时间?

时间:2018-06-13 20:12:01

标签: python sql pandas datetime time-series

在找到关于calculating time differences using Pandas的以下链接后,我仍然试图将这些知识融入我自己的数据中。这是我的数据集的样子:

In [10]: df 
Out[10]:
      id           time
   0  420 1/3/2018 8:32
   1  420 1/3/2018 8:36
   2  420 1/3/2018 8:42
   3  425 1/7/2018 12:35
   4  425 1/7/2018 14:29
   5  425 1/7/2018 16:15
   6  425 1/7/2018 16:36
   7  427 1/11/2018 20:50
   8  428 1/13/2018 16:35
   9  428 1/13/2018 17:36

我想在ID上执行groupby或其他函数,其输出为:

In [11]: pd.groupby(df[id])
Out [11]:

      id   time (duration)
   0  420  0:10
   1  425  4:01
   2  427  0:00
   3  428  1:01

id和time的类型分别是int64和object。使用python3和pandas 0.20。

编辑: 来自SQL,这似乎在功能上等同于:

select id, max(time) - min(time)
from df
group by id

编辑2 : 谢谢大家的快速回复。所有解决方案都给我一些版本的以下错误。不确定我在这里遗漏的特定数据集的相关内容:

TypeError: unsupported operand type(s) for -: 'str' and 'str'

3 个答案:

答案 0 :(得分:2)

groupby np.ptp

df.groupby('id').time.apply(np.ptp)

id
420   00:10:00
425   04:01:00
427   00:00:00
428   01:01:00
Name: time, dtype: timedelta64[ns]

答案 1 :(得分:1)

按事件ID对数据帧进行分组,并选择最小和最大的次数:

df1 = df.groupby('id').agg([max, min])

找出差异:

(df1[('time','max')] - df1[('time','min')]).reset_index()
#    id          0
#0  420   00:10:00
#1  425   04:01:00
#2  427   00:00:00
#3  428   01:01:00

答案 2 :(得分:0)

您需要按time对数据框进行排序,然后按id分组,然后才能获得每个组中time之间的差异。

df['time'] = pd.to_datetime(df['time'])
df.sort_values(by='time').groupby('id')['time'].apply(lambda g: g.max() - g.min()).reset_index(name='duration')

输出:

     id duration
0   420 00:10:00
1   425 04:01:00
2   427 00:00:00
3   428 01:01:00