Pandas中DatetimeIndex按年偏移结果不符合预期如何解决?
问题原因
你对shift方法的频率参数理解存在偏差:pandas中'Y'作为频率参数时,默认指代年末锚定偏移(YearEnd),shift(1, 'Y')的逻辑是把每个日期偏移到下一个年末日期,因此所有日期都会对齐到同一年的12月31日,并不是你预期的「月日不变、年份加1」。
所有锚定型频率(比如'Y'年末、'M'月末、'QS'季初等)用在shift方法中时,都会将日期对齐到对应周期的锚点,不会保留原日期的月/日信息。另外按365D偏移的方案会受平闰年影响,不推荐使用。
正确实现方式
要实现日期保留月日、仅年份向后偏移1年,直接使用pd.DateOffset指定偏移规则即可,兼容你使用的pandas 1.3.0版本:
import pandas as pd month_starts = pd.date_range('1/1/2011', periods=5, freq='MS') # 仅偏移年份,保留月日信息 shifted_index = month_starts + pd.DateOffset(years=1) # 如果需要保留原索引的MS(月初)频率,可以手动赋值 shifted_index.freq = 'MS' print("Original:", month_starts) print("Shifted :", shifted_index)
运行输出结果和你预期完全一致:
Original: DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01', '2011-04-01', '2011-05-01'], dtype='datetime64[ns]', freq='MS') Shifted : DatetimeIndex(['2012-01-01', '2012-02-01', '2012-03-01', '2012-04-01', '2012-05-01'], dtype='datetime64[ns]', freq='MS')
该方案会自动处理边界情况:比如2020-02-29(闰年2月最后一天)偏移1年时,会自动调整为2021-02-28,不会生成非法日期。
内容的提问来源于stack exchange,提问作者fuenfundachtzig
相关产品推荐
相关产品推荐

