Pandas - 取 n 个月前的值

Pandas - Take value n month before

我正在使用日期时间。有没有办法得到n个月前的值

例如,数据如下:

dft = pd.DataFrame(
    np.random.randn(100, 1),
    columns=["A"],
    index=pd.date_range("20130101", periods=100, freq="M"),
)

dft

然后:

我一直在努力做的是:

dft['B'] = np.where(dft.index.month == 7, 
                    dft['A'].shift(7, freq='M') ,
                    dft['A'].shift(1, freq='M'))

然而,结果只是复制了A列。我不知道为什么。但是当我尝试单行代码时:

dft['C'] = dft['A'].shift(7, freq='M')

然后一切都按预期移动。我不知道这里有什么问题

问题是索引对齐。您执行的此转换作用于 index,但使用 numpy.where 您转换为数组 并丢失索引 .

改用pandas'where or mask,一切都将保留为系列,索引将被保留:

dft['B'] = (dft['A'].shift(1, freq='M')
            .mask(dft.index.month == 7,  dft['A'].shift(7, freq='M'))
            )

输出:

                   A         B
2013-01-31 -2.202668       NaN
2013-02-28  0.878792 -2.202668
2013-03-31 -0.982540  0.878792
2013-04-30  0.119029 -0.982540
2013-05-31 -0.119644  0.119029
2013-06-30 -1.038124 -0.119644
2013-07-31  0.177794 -1.038124
2013-08-31  0.206593 -2.202668  <- correct
2013-09-30  0.188426  0.206593
2013-10-31  0.764086  0.188426
...              ...       ...
2020-12-31  1.382249 -1.413214
2021-01-31 -0.303696  1.382249
2021-02-28 -1.622287 -0.303696
2021-03-31 -0.763898 -1.622287
2021-04-30  0.420844 -0.763898

[100 rows x 2 columns]