python - 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']....
但我应该如何编码呢?
解决方案
使用.groupby
with.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
推荐阅读
- python - 通过多处理队列 Python 3.6 发送套接字
- javascript - NodeJS 在前台和后台启动中的不同行为
- excel - 将新创建的公式添加到新模块中
- python - 嵌套循环遍历多个字典,有没有更简单的方法?
- velo - 放置在中继器上时,WIX 无法检索输入框的值
- r - 连接散点图 - 如何以所需的顺序连接点,而不是按 x 轴
- sql-server - 在 VB.NET 中运行 SQL Server 查询
- python - Python DataFrame - 检查其他行是否匹配 ID、类似时间戳
- react-native - react-native-router-flux 导航到同一场景
- c# - Sandcastle 未在 Visual Studio 中记录无库项目