按 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
我有一个 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