如何按分组计算不同行不同列的日期差及累计差值?
解决按分组计算跨行列日期差及累计值的问题
核心逻辑梳理
从你的示例能看出来,每个index分组里,有效date_b对应的是该组内最近的上一个有效date_a,我们需要先把每个date_b匹配到对应的date_a,再计算差值和累计值。
分步实现代码
假设你的DataFrame名为df,按以下步骤操作:
转换日期列类型
先确保date_a和date_b是datetime格式,否则无法计算日期差:import pandas as pd # 转换日期格式 df['date_a'] = pd.to_datetime(df['date_a'], format='%Y/%m/%d') df['date_b'] = pd.to_datetime(df['date_b'], format='%Y/%m/%d')分组填充最近的有效date_a
按index分组,用前向填充(ffill)把每个组内的有效date_a传递到后续行,这样每个date_b所在行就能拿到对应的匹配日期:df['filled_date_a'] = df.groupby('index')['date_a'].ffill()计算diff_days列
仅当date_b和填充后的filled_date_a都不为空时,计算天数差,否则保留NaT:df['diff_days'] = df.apply( lambda row: (row['date_b'] - row['filled_date_a']).days if pd.notna(row['date_b']) and pd.notna(row['filled_date_a']) else pd.NaT, axis=1 )计算cum_diff_days列
对diff_days的有效数值做累计求和,再把空值替换成'-':df['cum_diff_days'] = df['diff_days'].cumsum() df['cum_diff_days'] = df['cum_diff_days'].apply(lambda x: x if pd.notna(x) else '-')
验证结果
执行完上述代码后,你的DataFrame就会生成符合预期的diff_days和cum_diff_days列,和示例中的结果一致。如果不需要中间列filled_date_a,可以最后用df.drop('filled_date_a', axis=1)删掉。
内容的提问来源于stack exchange,提问作者Nazmi Husaini
相关产品推荐
相关产品推荐

