将具有多索引的每日数据框转换为季度

Convert Daily Dataframe with Multi Index to quarterly

我想将每日股票数据数据框转换为季度数据。但是,使用 resample 不起作用,因为我有一个多索引,所以我希望我的最终季度数据框仍然包含个股(resample 只是总结了所有这些):

import pandas as pd
dict1 = [
        {'ticker':'jpm','date': '2016-11-27','returns': 0.2},
        {'ticker':'jpm','date': '2016-11-28','returns': 0.2},
{'ticker':'ge','date': '2016-11-27','returns': 0.2},
{'ticker':'ge','date': '2016-11-28','returns': 0.2},
{'ticker':'amzn','date': '2016-11-27','returns': 0.2},
{'ticker':'amzn','date': '2016-11-28','returns': 0.2},
]
df1= pd.DataFrame(dict1)
df1['date']      = pd.to_datetime(df1['date'])
df1=df1.set_index(['date','ticker'], drop=True)  

我的最终结果应该是:

Q42016 JPM  0.2
Q42016 GE   0.2
Q42016 AMZ  0.2

当我使用重采样时,我得到:

Q42016  0.2

此外,我坚持 Pandas 0.18(长话短说)。感谢任何帮助。

第一个想法是通过将 ticker 转换为列来创建 DatetimeIndex,然后将 groupbyresample:

一起使用
df1 = df1.reset_index('ticker').groupby('ticker').resample('Q').mean()
print (df1)
                   returns
ticker date               
amzn   2016-12-31      0.2
ge     2016-12-31      0.2
jpm    2016-12-31      0.2

Grouper的另一个解决方案:

df1 = df1.groupby([pd.Grouper(freq='Q', level='date'), 'ticker']).mean()
print (df1)
                   returns
date       ticker         
2016-12-31 amzn        0.2
           ge          0.2
           jpm         0.2

对于季度期间使用 assign with to_period,然后按 groupby:

聚合
df1 = (df1.reset_index()
          .assign(date = lambda x: x['date'].dt.to_period('Q'))
          .groupby(['date','ticker'])
          .mean())
print (df1)
               returns
date   ticker         
2016Q4 amzn        0.2
       ge          0.2
       jpm         0.2