将Pandas中的多个日值列向前移动一年



给定数据帧df如下:

import pandas as pd
import numpy as np
np.random.seed(2021)
dates = pd.date_range('20130101', periods=720)
df = pd.DataFrame(np.random.randint(0, 100, size=(720, 3)), index=dates, columns=list('ABC'))
df

输出:

A   B   C
2013-01-01  85  57   0
2013-01-02  94  86  44
2013-01-03  62  91  29
2013-01-04  21  93  24
2013-01-05  12  70  70
..  ..  ..
2014-12-17  38  42  20
2014-12-18  67  93  47
2014-12-19  27  10  74
2014-12-20  18  92  62
2014-12-21  90  40  31

如何将列BC向前移动一年?谢谢请注意闰年问题。

下面的代码似乎适用于示例数据,但对于BC中包含NaN的真实数据,它会生成:ValueError: cannot reindex from a duplicate axis:

df[['B', 'C']] = df[['B', 'C']].shift(freq=pd.DateOffset(years=1))
print(df)

输出:

A     B     C
2013-01-01  85   NaN   NaN
2013-01-02  94   NaN   NaN
2013-01-03  62   NaN   NaN
2013-01-04  21   NaN   NaN
2013-01-05  12   NaN   NaN
..   ...   ...
2014-12-17  38  33.0  79.0
2014-12-18  67  24.0  53.0
2014-12-19  27  54.0  39.0
2014-12-20  18  68.0  80.0
2014-12-21  90  65.0  65.0

下面的代码似乎有效:

df[['B', 'C']] = df[['B', 'C']].shift(freq=pd.DateOffset(years=1))
print(df)

输出:

A     B     C
2013-01-01  85   NaN   NaN
2013-01-02  94   NaN   NaN
2013-01-03  62   NaN   NaN
2013-01-04  21   NaN   NaN
2013-01-05  12   NaN   NaN
..   ...   ...
2014-12-17  38  33.0  79.0
2014-12-18  67  24.0  53.0
2014-12-19  27  54.0  39.0
2014-12-20  18  68.0  80.0
2014-12-21  90  65.0  65.0

最新更新