将 df 重新采样到较小的时间步长并平均计数

问题描述

我有一个包含时间段内计数的数据框(3 小时内的降雨量),如下所示:

time_stamp,rain_fall_in_mm
2019-01-01 00:03:00,0.0
2019-01-01 00:06:00,3.9
2019-01-01 00:09:00,0.0
2019-01-01 00:12:00,1.2

我需要将数据帧上采样到 1 小时的时间段,我想平均降雨计数,以便没有 NaN 并且总降雨量保持不变,这意味着这是所需的结果:

time_stamp,rain_fall_in_mm
2019-01-01 00:01:00,0.0
2019-01-01 00:02:00,0.0
2019-01-01 00:03:00,0.0
2019-01-01 00:04:00,1.3
2019-01-01 00:05:00,1.3
2019-01-01 00:06:00,1.3
2019-01-01 00:07:00,0.0
2019-01-01 00:08:00,0.0
2019-01-01 00:09:00,0.0
2019-01-01 00:10:00,0.4
2019-01-01 00:11:00,0.4
2019-01-01 00:12:00,0.4

我发现我可以执行 series.resample('1H').bfill()series.resample('1H').pad() 之类的操作。这些解决了重采样问题,但不能满足所需的平均值。你有什么建议吗? Tnx

解决方法

试试这个:

df2 = df.reindex(pd.date_range(start = '1/1/2019',periods = 13,freq='1min'))
df2.fillna(0).groupby((~df2['rain_fall_in_mm'].isna()).iloc[::-1].cumsum()).transform('mean')
,

首先,确保您的索引是日期时间格式。如果不是,您可以通过以下方式执行此操作:

df.set_index(pd.date_range(start=df.time_stamp[0],periods=len(df),freq='3H'),inplace=True)

如果只想放大一列,就用这个

df_rain_hourly_column = df.resample('H').bfill().rain / 3.

如果您的初始 df 只包含浮点数,您可以对整个数据框进行操作

df2 = df.resample('H').bfill() / 3.

除以 3.(old_time_period/new_time_period 的长度因子)有点麻烦,但我真的没有在任何地方找到更通用和简单的解决方案。