首页 > 解决方案 > 将 DatetimeIndex 移动一年会产生意想不到的结果

问题描述

我有一个带有 a 的数据框,DatetimeIndex并且想将日期移动一年。我以为我可以这样做df.index.shift(1, 'Y'),但是所有日期都在年底堆积起来?

我的意思是(使用文档中的示例):

import pandas as pd
month_starts = pd.date_range('1/1/2011', periods=5, freq='MS')
print("Original:", month_starts)
print("Shifted :", month_starts.shift(1, 'Y'))

此代码创建一个DatetimeIndex包含 5 个日期的日期并将这些日期移动一年。但是,输出是

Original: DatetimeIndex(['2011-01-01', '2011-02-01', '2011-03-01', '2011-04-01',
              '2011-05-01'],
              dtype='datetime64[ns]', freq='MS')
Shifted : DatetimeIndex(['2011-12-31', '2011-12-31', '2011-12-31', '2011-12-31',
              '2011-12-31'],
              dtype='datetime64[ns]', freq=None)

转变的预期结果将是['2012-01-01', '2012-02-01', '2012-03-01', '2012-04-01', '2012-05-01']。我是否误解了该功能应该做什么?

注释:

标签: pythonpandasdatetime

解决方案


您可以使用 DateOffset 作为freq

month_starts.shift(freq = pd.DateOffset(years = 1))

给出:

DatetimeIndex(['2012-01-01', '2012-02-01', '2012-03-01', '2012-04-01',
              '2012-05-01'],
              dtype='datetime64[ns]', freq=None)

笔记:

谨慎使用。闰日(2 月 29 日)将转换为 2 月 28 日(根据评论)。


推荐阅读