【问题标题】:Resample df to smaller time steps and average the counts将 df 重新采样到更小的时间步并平均计数
【发布时间】:2021-02-11 02:01:38
【问题描述】:

我有一个数据框,其中包含一段时间内的计数(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() 的事情。这些解决了重采样问题,但不满足所需的平均。你有什么建议吗?天呐

【问题讨论】:

    标签: python pandas dataframe interpolation resampling


    【解决方案1】:

    试试这个:

    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')
    

    【讨论】:

    • 不,它不起作用。它创建一个具有正确间隔的df2,但df2 仅包含NaN。不过还是谢谢!可以再试一次吗?
    • 您的索引是否设置为日期时间索引?
    • 你对我的索引是正确的,它不在日期时间。我更正了它,但现在我再次为新创建的中间行获得了 NaN。我找到了一个更简单的解决方案:df_rain_hourly_column = df.resample('H').bfill().rain / 3. 但是感谢您的帖子,我会投票赞成!如果您仍然知道如何纠正它,请告诉我!
    【解决方案2】:

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

    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 的长度因子)有点笨拙,但我真的没有在任何地方找到更通用和简单的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2019-06-05
      • 2022-11-29
      • 1970-01-01
      • 2022-11-27
      • 2020-05-14
      • 2021-08-01
      • 2021-11-24
      • 2017-10-07
      相关资源
      最近更新 更多