我有一年中每日价值的时间序列:
DATE VAL
2017-01-01 -0.298653
2017-01-02 -0.224910
2017-01-03 -0.216723
....
2017-12-29 0.061681
2017-12-30 0.078109
2017-12-31 0.106636
Freq: D, Length: 365, dtype: float64
我需要通过对原始值求平均值,将VAL
列中的这一系列 365 值转换为一系列 272 值。
我想我需要重新采样"这个值的序列在频率为365/272。
我考虑过resample
和asfreq
,但这些似乎只允许我改变整个时间单位的频率。
不幸的是,我对数学的掌握以及我的蟒蛇技能都缺乏。非常感谢关于如何思考这个的一些指示!
修改
在采用Graipher的优秀解决方案之前,我已经接受了这个近似值:
step = 365/float(272)
a = np.zeros(shape=(272,))
for i in range(0, 272):
a[i] = df[int(round(i * step))]
答案 0 :(得分:2)
你可以使用pd.DataFrame.resample
功能,它还允许分数时间单位。您只需确保首先将日期设置为索引并确保它是日期时间对象:
def resample(df, target_freq, unit_str):
resample_str = "{:.4g}{}".format(len(df)/target_freq, unit_str)
return df.resample(resample_str).mean()
df = ... # your definition here
df['DATE'] = pd.to_datetime(df['DATE'])
df = df.set_index('DATE')
df_resampled = resample(df, 272., "D")
print(len(df_resampled))
# 272
但是,小数值不能是任意长度。 df.resample("{:.4g}D".format(365./272))
有效,但df.resample("{}D".format(365./272))
没有。似乎是四到五位之间的限制。