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

如何按分组计算不同行不同列的日期差及累计差值?

解决按分组计算跨行列日期差及累计值的问题

核心逻辑梳理

从你的示例能看出来,每个index分组里,有效date_b对应的是该组内最近的上一个有效date_a,我们需要先把每个date_b匹配到对应的date_a,再计算差值和累计值。

分步实现代码

假设你的DataFrame名为df,按以下步骤操作:

  1. 转换日期列类型
    先确保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')
    
  2. 分组填充最近的有效date_a
    按index分组,用前向填充(ffill)把每个组内的有效date_a传递到后续行,这样每个date_b所在行就能拿到对应的匹配日期:

    df['filled_date_a'] = df.groupby('index')['date_a'].ffill()
    
  3. 计算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
    )
    
  4. 计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:46:20