如何按Project Id计算Technical Analysis与Approval的结束日期间隔天数?
按Project Id计算指定任务的日期间隔解决方案
核心问题分析
你之前的代码返回相同天数,本质是没有按Project Id分组计算,而是全局取了两个任务的日期差,导致所有项目共用同一个结果。要解决这个问题,核心是按项目分组后,分别提取目标任务的日期再计算差值。
具体实现步骤(基于Pandas)
1. 先确保日期列是datetime类型
如果End Date还不是日期格式,先转换:
import pandas as pd # 转换日期列格式 df['End Date'] = pd.to_datetime(df['End Date'])
2. 方法一:用透视表(Pivot Table)计算
先把每个项目的两个任务日期转成单独列,再计算差值,最后合并回原数据集:
# 生成透视表,每个Project Id对应两个任务的End Date pivot_df = df.pivot_table( index='Project Id', columns='Task Name', values='End Date', aggfunc='first' # 若同一项目同一任务有多条记录,可换成min/max取最早/最晚日期 ).reset_index() # 计算两个任务的天数差 pivot_df['Days Between'] = (pivot_df['Approval'] - pivot_df['Technical Analysis']).dt.days # 合并回原数据集,给所有行添加对应项目的天数差 df = df.merge(pivot_df[['Project Id', 'Days Between']], on='Project Id', how='left')
3. 方法二:分组后自定义函数计算
直接按Project Id分组,在每个组内提取目标任务日期并计算:
def calc_task_interval(group): # 提取当前组内两个任务的日期 tech_date = group.loc[group['Task Name'] == 'Technical Analysis', 'End Date'].iloc[0] approval_date = group.loc[group['Task Name'] == 'Approval', 'End Date'].iloc[0] # 返回天数差 return (approval_date - tech_date).days # 分组计算后,将结果映射到原数据集的新列 df['Days Between'] = df.groupby('Project Id').apply(calc_task_interval).reset_index(drop=True)
关键注意事项
- 确保每个
Project Id下存在且唯一对应Technical Analysis和Approval任务记录,若有重复,需调整aggfunc(比如用min取最早完成日期) - 无论
Task Name列有多少其他任务,上述方法只会提取指定的两个任务进行计算,不受其他任务干扰
内容的提问来源于stack exchange,提问作者Beatriz
相关产品推荐
相关产品推荐

