2017-04-12 72 views
2

目前我正在使用来自FRED的一些数据,我使用quandl进行了抽取。 我收到的数据是在一个数据帧中。熊猫数据框:将年份和列索引更改为月份

目前,它返回像这样

DATE VALUE 
1966-01-01 31.880 
1966-02-01 32.080 
1966-03-01 32.180 
1966-04-01 32.280 
... ... 
2013-08-01 233.323 
2013-09-01 233.632 
2013-10-01 233.718 
2013-11-01 234.121 

但我想用于重组为显示:

 Jan  Feb  Mar  Apr... 
1966 31.880 32.080 32.180 32.280 
... 
2013 233.323 233.632 233.718 234.121 

编辑:我想这将是有益的。

DatetimeIndex(['1966-01-01', '1966-02-01', '1966-03-01', '1966-04-01', 
       '1966-05-01', '1966-06-01', '1966-07-01', '1966-08-01', 
       '1966-09-01', '1966-10-01', 
       ... 
       '2015-04-01', '2015-05-01', '2015-06-01', '2015-07-01', 
       '2015-08-01', '2015-09-01', '2015-10-01', '2015-11-01', 
       '2015-12-01', '2016-01-01'], 
       dtype='datetime64[ns]', name=u'DATE', length=601, freq=None) 
Index([u'VALUE'], dtype='object') 

回答

3

您可以使用pandas.crosstab

df.DATE = pd.to_datetime(df.DATE) # optional if the DATE column is already datetime type 

pd.crosstab(df.DATE.dt.year, 
      df.DATE.dt.strftime("%b"), 
      df.VALUE, 
      aggfunc="sum", 
      rownames=["Year"], 
      colnames=["Month"]) 

enter image description here

更新:如果你有时间的指标:

pd.crosstab(df.index.year, 
      df.index.strftime("%b"), 
      df.VALUE, 
      aggfunc="sum", 
      rownames=["Year"], 
      colnames=["Month"]) 
+0

我不认为这会工作,由于日在被索引,而不是列。 – user3093175

+0

如果DATE是索引,则可以使用'df.index'而不是'df.DATE.dt',查看更新。 – Psidom

+0

谢谢Psidom。我对熊猫有点新鲜,并且有很多会员记忆的方法。 – user3093175

1

我喜欢pd.Series构造此和unstack

pd.Series(
    df.VALUE.values, 
    [df.DATE.dt.year.values, 
    df.DATE.dt.strftime("%b").values] 
).unstack() 

     Apr  Aug Feb Jan Mar  Nov  Oct  Sep 
1966 32.28  NaN 32.08 31.88 32.18  NaN  NaN  NaN 
2013 NaN 233.323 NaN NaN NaN 234.121 233.718 233.632 

或等价与

df.set_index(
    [df.DATE.dt.year, 
    df.DATE.dt.strftime('%b')], 
).VALUE.rename_axis([None, None]).unstack() 

天真时机

enter image description here