将大熊猫数据帧下采样到任意长度

时间:2018-02-12 20:09:04

标签: python pandas dataframe

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

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,但这些似乎只允许我改变整个时间单位的频率。

不幸的是,我对数学的掌握以及我的蟒蛇技能都缺乏。非常感谢关于如何思考这个的一些指示!

修改

在采用Graipher的优秀解决方案之前,我已经接受了这个近似值:

step = 365/float(272)
a = np.zeros(shape=(272,))
for i in range(0, 272):
    a[i] = df[int(round(i * step))]

1 个答案:

答案 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))没有。似乎是四到五位之间的限制。