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

Python Pandas实现日期在start_date前12个月判断生成新列

pandas 按12个月时间窗口新增字段实现

实现思路

规则拆解为两个必须同时满足的判断条件:

  1. 调查日期survey_date不晚于起始日期start_date
  2. 调查日期距离起始日期的间隔不超过12个月
    注意:不要直接用365天折算12个月,会因闰年、大小月天数差异产生计算误差,使用pandas内置的DateOffset做日期偏移可以保证月份计算的准确性。

可直接运行的代码

import pandas as pd

# 构造样例数据,读取自有数据时可跳过本段
df = pd.DataFrame({
    'ID': [1, 1, 1, 1, 2, 2],
    'survey_date': ['2019-05-01', '2021-05-01', '2023-05-01', '2021-12-01', '2010-01-01', '2011-05-01'],
    'start_date': ['2022-05-01', '2022-05-01', '2022-05-01', '2022-05-01', '2010-02-01', '2010-02-01']
})

# 强制转换两列为日期类型,若字段已是datetime格式可跳过
df['survey_date'] = pd.to_datetime(df['survey_date'])
df['start_date'] = pd.to_datetime(df['start_date'])

# 计算12个月窗口的左边界:起始日期往前推12个月
window_left = df['start_date'] - pd.DateOffset(years=1)

# 按判断条件赋值,布尔值转int即得到0/1结果
df['new_column'] = (
    (df['survey_date'] >= window_left) 
    & (df['survey_date'] <= df['start_date'])
).astype(int)

运行结果

执行代码后输出的DataFrame完全匹配预期:

IDsurvey_datestart_datenew_column
12019-05-012022-05-010
12021-05-012022-05-011
12023-05-012022-05-010
12021-12-012022-05-011
22010-01-012010-02-011
22011-05-012010-02-010

适配调整说明

  • 如果业务规则中“12个月范围内”不包含survey_date刚好等于start_date的场景,把判断条件中的<= df['start_date']修改为< df['start_date']即可
  • 处理千万级以上超大数据集时,DateOffset计算性能偏低,可替换为pd.Timedelta(days=365)做近似计算,在误差可接受的场景下能大幅提升运行速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:18:20