Pandas实现日度列向前偏移1年 兼顾闰年及重复轴报错处理
报错ValueError: cannot reindex from a duplicate axis的核心原因是pd.DateOffset(years=1)处理闰年2月29日这类特殊日期时,偏移后会和同年2月28日的偏移结果重合,导致索引重复,和列中是否存在NaN没有直接关联。
兼容实现方案
核心思路是手动处理偏移后的重复索引,再和原DataFrame的索引对齐,原生适配闰年规则,同时兼容含NaN的场景:
# 提取待偏移的B、C列 offset_data = df[['B', 'C']].copy() # 索引向前偏移1年,pandas会自动将闰年2月29日对齐到下一年的2月28日 offset_data.index = offset_data.index + pd.DateOffset(years=1) # 处理偏移后的重复索引:默认保留第一个出现的数值,可根据业务需求调整keep参数为last,或用groupby聚合 offset_data = offset_data[~offset_data.index.duplicated(keep='first')] # 对齐原df的索引,不存在的日期位置自动填充NaN df[['B', 'C']] = offset_data.reindex(df.index)
方案说明
- 闰年适配:
pd.DateOffset(years=1)原生支持闰年处理,2020-02-29偏移1年后会自动调整为2021-02-28,符合常规业务的日期偏移逻辑 - 重复索引处理:通过
duplicated方法提前清理重复的偏移后索引,避免赋值时的轴冲突 - NaN兼容:
reindex方法会自动保留原有的NaN值,不存在的日期位置也会自动填充NaN,完全符合预期输出要求
使用示例数据运行上述代码后,2013年全年的B、C列都会填充为NaN,2014年的对应位置会匹配2013年同日的数值,和给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

