在找到以下有关使用 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
我想对输出为:
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'
groupby
withnp.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]
按事件 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
您需要按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