使用 Datetime.Offset 滚动移动平均线

问题描述

我有一个每日数据的时间序列,我想取某个时期的滚动平均值。是否可以使用 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