问题描述
我有一个每日数据的时间序列,我想取某个时期的滚动平均值。是否可以使用 Datetime.Offset
执行此操作?
代码可能如下所示:
l = [7.71,7.79,6.80,6.44,6.46,6.80]
index = pd.DatetimeIndex(['2016-01-04','2016-01-05','2016-01-06','2017-01-04','2017-01-05','2017-01-06'])
df = pd.DataFrame(l,columns=['col'],index = index)
我想要计算时间序列的年平均值。使用上述数字,输出应如下所示:
2017-01-04 7.185
2017-01-05 6.873
2017-01-05 6.625
我试着写成如下
df.rolling(window=1,freq='A').mean()
但收到以下错误消息:
TypeError: rolling() got an unexpected keyword argument 'freq'
我还尝试了以下方法:
do = pd.DateOffset(years = 1)
eps.rolling(window=do).mean()
但收到以下错误消息:
ValueError: <DateOffset: years=1> is a non-fixed frequency
这可能与rollong有关还是我应该尝试另一种方法?
解决方法
出现错误的原因是 rolling
不接受 freq
参数。要使用年度滚动窗口,您必须使用 365D
也解释过 here。问题是 1Y
可能有不同的天数,即频率是“非固定的”。
在你的情况下,这将转化为
df.rolling('365D').mean()
,
首先将您的索引转换为 DatetimeIndex。
df.index = pd.to_datetime(df.index)
按月和日分组并计算平均值
df_ = df.groupby([df.index.month,df.index.day]).mean()
# print(df_)
col
1 4 7.075
5 7.125
6 6.800
如果你想得到一个普通的索引,你可以这样做
df_ = df.groupby([df.index.month,df.index.day]).mean()
df_ = df_.reset_index()
df_['month-day'] = df_['level_0'].astype(str) + '-' + df_['level_1'].astype(str)
df_.drop(['level_0','level_1'],axis=1,inplace=True)
# print(df_)
col month-day
0 7.075 1-4
1 7.125 1-5
2 6.800 1-6
或者您可以创建一个包含月和日的新列
df['month-day'] = df.index.strftime('%m-%d')
df_ = df.groupby('month-day').mean().reset_index()
# print(df_)
month-day col
0 01-04 7.075
1 01-05 7.125
2 01-06 6.800