我有一年的每日时间序列:

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的频率“重新采样”此值序列。

我已经考虑过resampleasfreq,但是这些似乎仅允许我更改整个时间单位的频率。

不幸的是,我缺乏数学知识以及我的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/

10-12 16:29