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
然后:
- 对于每年的七月,我们取上一年十二月的值并应用到下一年的六月
剩下的一个月(今年8月到明年6月)取上月的值
- 例如:从 2000 年 7 月到 2001 年 6 月的值将相同并等于 1999 年 12 月的值。
我一直在努力做的是:
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]
我正在使用日期时间。有没有办法得到n个月前的值
例如,数据如下:
dft = pd.DataFrame(
np.random.randn(100, 1),
columns=["A"],
index=pd.date_range("20130101", periods=100, freq="M"),
)
dft
然后:
- 对于每年的七月,我们取上一年十二月的值并应用到下一年的六月
剩下的一个月(今年8月到明年6月)取上月的值- 例如:从 2000 年 7 月到 2001 年 6 月的值将相同并等于 1999 年 12 月的值。
我一直在努力做的是:
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]