【问题标题】:Shift multiple daily value columns forward by one year in Pandas在 Pandas 中将多个每日价值列向前移动一年
【发布时间】:2021-12-21 19:10:32
【问题描述】:

给定一个数据框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 内包含NaNs 的真实数据,它会生成: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

【问题讨论】:

    标签: python-3.x pandas dataframe numpy datetime


    【解决方案1】:

    下面的代码似乎有效:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多