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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:04