我有一年的每日时间序列:
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
,但是这些似乎仅允许我更改整个时间单位的频率。不幸的是,我缺乏数学知识以及我的python技能。非常感谢您提供一些有关如何思考的建议!
编辑:
在采用下面的Graipher的高级解决方案之前,我已经确定了这种近似值:
step = 365/float(272)
a = np.zeros(shape=(272,))
for i in range(0, 272):
a[i] = df[int(round(i * step))]
最佳答案
您可以为此使用pd.DataFrame.resample
函数,它还允许使用小数时间单位。您只需要确保首先将日期设置为索引,并确保它是一个datetime对象:
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))
无效。四位数至五位数之间的某个地方似乎是极限。关于python - 将 Pandas 数据帧下采样到任意长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48754721/