Python Pandas实现日期在start_date前12个月判断生成新列
pandas 按12个月时间窗口新增字段实现
实现思路
规则拆解为两个必须同时满足的判断条件:
- 调查日期
survey_date不晚于起始日期start_date - 调查日期距离起始日期的间隔不超过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完全匹配预期:
| ID | survey_date | start_date | new_column |
|---|---|---|---|
| 1 | 2019-05-01 | 2022-05-01 | 0 |
| 1 | 2021-05-01 | 2022-05-01 | 1 |
| 1 | 2023-05-01 | 2022-05-01 | 0 |
| 1 | 2021-12-01 | 2022-05-01 | 1 |
| 2 | 2010-01-01 | 2010-02-01 | 1 |
| 2 | 2011-05-01 | 2010-02-01 | 0 |
适配调整说明
- 如果业务规则中“12个月范围内”不包含
survey_date刚好等于start_date的场景,把判断条件中的<= df['start_date']修改为< df['start_date']即可 - 处理千万级以上超大数据集时,
DateOffset计算性能偏低,可替换为pd.Timedelta(days=365)做近似计算,在误差可接受的场景下能大幅提升运行速度
内容的提问来源于stack exchange,提问作者Daven1
相关产品推荐
相关产品推荐

