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

如何使用Python Pandas按id分组从重置点反向计算日期天数差

解决思路

核心逻辑是给每一行匹配到后方最近的reset="Y"对应的日期作为基准日,规则如下:

  • 若当前行是reset="Y",负向差固定为0
  • 若当前行是reset="N",负向差为当前日期减去后方最近的reset="Y"日期的天数
  • 若后方没有reset="Y"记录,负向差固定为0

修正后代码

import pandas as pd
import numpy as np

df = pd.DataFrame({'reset':['N','Y','N','N','N','Y','N'],
                   'date':['2019-09-04','2020-12-06','2020-12-06','2019-09-07','2019-11-08','2021-05-21','2021-06-23'],
                   'id':[16860,16860,16860,16860,16860,16860,16860]
                   })

# 修正日期转换格式,和实际日期分隔符匹配
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
df = df.sort_values(['id','date']).reset_index(drop=True)

# 保留原有正确的分组逻辑
df['group'] = df['reset'].replace({'N':False,'Y':True})
df['group'] = df.groupby('id')['group'].cumsum()

# 生成基准日列:reset=Y行填充自身日期,其余为空,按id向后填充最近的基准日
df['base_date'] = df.apply(lambda x: x['date'] if x['reset'] == 'Y' else pd.NaT, axis=1)
df['base_date'] = df.groupby('id')['base_date'].fillna(method='bfill')

# 计算负向天数差
df['negative difference'] = df.apply(
    lambda x: 0 if x['reset'] == 'Y' or pd.isna(x['base_date']) else (x['date'] - x['base_date']).days,
    axis=1
)

# 删除临时基准列
df = df.drop('base_date', axis=1)

print(df)

输出结果

reset       date     id  group  negative difference
0     N 2019-09-04  16860    0.0                 -459
1     N 2019-09-07  16860    0.0                 -456
2     N 2019-11-08  16860    0.0                 -394
3     Y 2020-12-06  16860    1.0                    0
4     N 2020-12-06  16860    1.0                 -166
5     Y 2021-05-21  16860    2.0                    0
6     N 2021-06-23  16860    2.0                    0

内容的提问来源于stack exchange,提问作者Ze0ruso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:15:01