按 Pandas 中 DateTimeIndex 的属性进行索引或分组

Index or group by attributes of a DateTimeIndex in Pandas

我有一个 66 年的时间序列 DataFrame,其中包含一个 DatetimeIndex 的 S&P500 月度变化。我怎样才能将数据分成年度数据列。

1) 类似于堆叠(并为标签保留)DateTimeIndex 属性 'month' 和 'year'

2) 没有循环

--本质上我想切片像

c_test[c_test.index.month==1]
c_test[c_test.index.month==2]
c_test[c_test.index.month==3]
c_test[c_test.index.month==4]
....up to 12

--进入由 'c_test.index.year' 标签标记的行

这可能吗?还是我需要放弃 DateTimeIndex?

这是一个简单的方法。 使用来自 https://www.quandl.com/api/v1/datasets/GOOG/NYSE_SPY.csv

的数据的示例

1]加载数据,添加年月日期

import pandas as pd
df = pd.read_csv('/Users/nicolas/Downloads/GOOG-NYSE_SPY.csv', parse_dates=[0])
df['Year'] = df['Date'].apply(lambda x: x.year)
df['Month'] = df['Date'].apply(lambda x: x.month)
df.head()

输出:

        Date    Open    High     Low   Close     Volume  Year  Month
0 2015-02-03  203.00  204.85  202.55  204.84  124212881  2015      2
1 2015-02-02  200.05  202.03  197.86  201.92  163106969  2015      2
2 2015-01-30  200.57  202.17  199.13  199.45  197729724  2015      1
3 2015-01-29  200.38  202.30  198.68  201.99  173585424  2015      1
4 2015-01-28  204.17  204.29  199.91  200.14  168514312  2015      1

2] 通过按年和月分组计算月度性能。注意双 [ 将输出作为 groupby 操作的数据帧:

month_perf = df.groupby(['Year', 'Month'])[['Close']].last()
month_perf['month_perf'] = month_perf.pct_change(periods=1)
month_perf = month_perf.reset_index()
month_perf.head()

输出:

   Year  Month  Close  month_perf
0  1997      8  92.59         NaN
1  1997      9  93.31    0.007776
2  1997     10  95.62    0.024756
3  1997     11  94.00   -0.016942
4  1997     12  98.09    0.043511

3] 年度性能相同,只是我们按年份分组:

year_perf = df.groupby(['Year'])[['Close']].last()
year_perf['annual_perf'] = year_perf.pct_change(periods=1)
year_perf = year_perf.reset_index()
year_perf.head()

输出

   Year   Close  annual_perf
0  1997   92.59          NaN
1  1998   97.56     0.053678
2  1999  123.03     0.261070
3  2000  145.44     0.182151
4  2001  128.81    -0.114343

4] 最后,我们合并两个数据帧:

df_result = pd.merge(month_perf, year_perf, left_on='Year', right_on='Year')
print df_result.tail()

输出:

     Year  Month  Close_x  month_perf  Close_y  annual_perf
206  2014     10   194.35   -0.031205   182.92     0.252362
207  2014     11   201.77    0.038179   182.92     0.252362
208  2014     12   205.76    0.019775   182.92     0.252362
209  2015      1   205.43   -0.001604   205.43     0.123059
210  2015      2   201.92   -0.017086   205.43     0.123059