You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按ID/Category/Site分组计算首尾任务完成日期的天数差

Pandas计算分组内最早与最晚日期的天数差

我有一个结构如下的DataFrame:

IDCategorySiteTask Completed
1AX1/2/22 12:00:00AM
1AX1/3/22 12:00:00AM
1AX1/1/22 12:00:00AM
1AX1/2/22 1:00:00AM
1BY1/1/22 1:00:00AM
2AZ1/2/22 12:00:00AM
2AZ1/1/22 12:00:00AM

可以看到,同一个ID/Category/Site组合可能对应多个Task Completed日期。我需要计算每个组合对应的最早(最小)和最晚(最大)Task Completed日期之间的天数差,预期结果如下:

IDCategorySiteTime Difference
1AX2
1BY0
2AZ1

目前我已经知道要把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:45:41