首页 > 解决方案 > Pandas - 如何计算 groupby 对象的持续时间

问题描述

我有一个看起来像这样的数据框

ID DATE                Remark
A  2020-06-22 16:10:00 P
A  2020-06-22 11:00:00 F
A  2020-06-22 10:50:00 P
B  2020-06-22 15:15:00 P
B  2020-06-22 15:10:00 F
A  2020-06-22 10:40:00 F
B  2020-06-22 15:00:00 F

我想要类似的东西

ID DATE                Duration Remark
A  2020-06-22 11:10:00 null     P
A  2020-06-22 11:00:00 05:10:00 F
A  2020-06-22 10:50:00 null     P
A  2020-06-22 10:40:00 00:10:00 F
B  2020-06-22 15:15:00 null     P
B  2020-06-22 15:10:00 00:05:00 F
B  2020-06-22 15:00:00 00:10:00 F

DATE 的 dtype 是 datetime64 并且已经按降序排列。备注 P 的持续时间将始终为 null 或 0。我想我需要编写类似的东西,df.groupby('ID')['DATE']....但我应该如何编码呢?

标签: pythonpandas

解决方案


使用.groupbywith.cumcount()来识别组中的差异并按 > 0 过滤以忽略该组的第一行。然后用于.shift与上一行进行比较并获取时间差异:

输入:

   ID  DATE                 Duration  Remark
0  A   2020-06-22 11:10:00  null      P
1  A   2020-06-22 11:00:00  05:10:00  F
2  A   2020-06-22 10:50:00  null      P
3  A   2020-06-22 10:40:00  00:10:00  F
4  B   2020-06-22 15:15:00  null      P
5  B   2020-06-22 15:10:00  00:05:00  F
6  B   2020-06-22 15:00:00  00:10:00  F

代码:

# commented the following line out asuming that it is in datetime format. If not, then use the below line.
# df['DATE'] = pd.to_datetime(df['DATE'])
df['Duration'] = np.where((df.groupby('ID').cumcount() > 0), (df.shift()['DATE'] - df['DATE']), np.nan)

输出:

    ID  DATE                Duration    Remark
0   A   2020-06-22 11:10:00 NaT         P
1   A   2020-06-22 11:00:00 00:10:00    F
2   A   2020-06-22 10:50:00 00:10:00    P
3   A   2020-06-22 10:40:00 00:10:00    F
4   B   2020-06-22 15:15:00 NaT         P
5   B   2020-06-22 15:10:00 00:05:00    F
6   B   2020-06-22 15:00:00 00:10:00    F

推荐阅读