按ID/Category/Site分组计算首尾任务完成日期的天数差
Pandas计算分组内最早与最晚日期的天数差
我有一个结构如下的DataFrame:
| ID | Category | Site | Task Completed |
|---|---|---|---|
| 1 | A | X | 1/2/22 12:00:00AM |
| 1 | A | X | 1/3/22 12:00:00AM |
| 1 | A | X | 1/1/22 12:00:00AM |
| 1 | A | X | 1/2/22 1:00:00AM |
| 1 | B | Y | 1/1/22 1:00:00AM |
| 2 | A | Z | 1/2/22 12:00:00AM |
| 2 | A | Z | 1/1/22 12:00:00AM |
可以看到,同一个ID/Category/Site组合可能对应多个Task Completed日期。我需要计算每个组合对应的最早(最小)和最晚(最大)Task Completed日期之间的天数差,预期结果如下:
| ID | Category | Site | Time Difference |
|---|---|---|---|
| 1 | A | X | 2 |
| 1 | B | Y | 0 |
| 2 | A | Z | 1 |
目前我已经知道要把Task Completed字段转换为datetime类型,并使用groupby按相关字段分组,代码示例如下:
df = pd.DataFrame( [[1,'A','X','1/2/22 12:00:00AM'], [1,'A','X','1/3/22 12:00:00AM'], [1,'A','X','1/1/22 12:00:00AM'], [1,'A','X','1/2/22 1:00:00AM'], [1,'B','Y','1/1/22 1:00:00AM'], [2,'A','Z','1/2/22 12:00:00AM'], [2,'A','Z','1/1/22 12:00:00AM']], columns=['ID', 'Category', 'Site', 'Task Completed']) df['task_completed'] = pd.to_datetime(df['Task Completed']) res = df.sort_values('task_completed').groupby(['ID','Site','Category']).first()
但我不确定如何获取最大值并进行减法运算以得到预期结果。
解决方案
你可以通过groupby结合agg方法,同时提取每组的最大和最小日期,再计算两者的天数差:
# 转换日期类型 df['task_completed'] = pd.to_datetime(df['Task Completed']) # 分组计算最大、最小日期,再求天数差 result = df.groupby(['ID', 'Category', 'Site'])['task_completed'].agg(['min', 'max']) result['Time Difference'] = (result['max'] - result['min']).dt.days # 重置索引并整理列顺序 result = result.reset_index()[['ID', 'Category', 'Site', 'Time Difference']] print(result)
运行后输出结果如下:
ID Category Site Time Difference 0 1 A X 2 1 1 B Y 0 2 2 A Z 1
关键说明
- 使用
agg(['min', 'max'])可以一次性获取每组的最早和最晚日期,比分别调用min()和max()更高效 - 两个datetime类型相减得到
Timedelta对象,通过.dt.days提取天数部分 - 最后重置索引并调整列顺序,让结果和预期格式一致
内容的提问来源于stack exchange,提问作者CowboyCoder
相关产品推荐
相关产品推荐

