【问题标题】:How do I interpolate hourly datetime data as mean of prior and following day in pandas/如何在 pandas/ 中插入每小时日期时间数据作为前一天和后一天的平均值
【发布时间】:2021-12-06 15:17:11
【问题描述】:

我有一个 pandas 数据框,其中包含大量每小时数据点。有几天,缺少数据 (NaN)。我想通过计算前一天和后一天同一时间段的平均值来插入丢失的每小时数据点的值(我已经做了一些分析,并认为这是合理的)。

数据示例如下:

datetime value
2018-11-17 00:00:00 9.12
2018-11-17 01:00:00 8.94
2018-11-17 02:00:00 8.68
2018-11-17 03:00:00 8.19
2018-11-17 04:00:00 7.75
2018-11-17 05:00:00 7.35
2018-11-17 06:00:00 7.05
2018-11-17 07:00:00 6.55
2018-11-17 08:00:00 6.30
2018-11-17 09:00:00 6.28
2018-11-17 10:00:00 6.68
2018-11-17 11:00:00 7.64
2018-11-17 12:00:00 8.61
2018-11-17 13:00:00 9.44
2018-11-17 14:00:00 9.84
2018-11-17 15:00:00 9.62
2018-11-17 16:00:00 8.17
2018-11-17 17:00:00 6.16
2018-11-17 18:00:00 5.93
2018-11-17 19:00:00 5.36
2018-11-17 20:00:00 4.69
2018-11-17 21:00:00 4.36
2018-11-17 22:00:00 4.68
2018-11-17 23:00:00 4.86
2018-11-18 00:00:00 NaN
2018-11-18 01:00:00 NaN
2018-11-18 02:00:00 NaN
2018-11-18 03:00:00 NaN
2018-11-18 04:00:00 NaN
2018-11-18 05:00:00 NaN
2018-11-18 06:00:00 NaN
2018-11-18 07:00:00 NaN
2018-11-18 08:00:00 NaN
2018-11-18 09:00:00 NaN
2018-11-18 10:00:00 NaN
2018-11-18 11:00:00 NaN
2018-11-18 12:00:00 NaN
2018-11-18 13:00:00 NaN
2018-11-18 14:00:00 NaN
2018-11-18 15:00:00 NaN
2018-11-18 16:00:00 NaN
2018-11-18 17:00:00 NaN
2018-11-18 18:00:00 NaN
2018-11-18 19:00:00 NaN
2018-11-18 20:00:00 NaN
2018-11-18 21:00:00 NaN
2018-11-18 22:00:00 NaN
2018-11-18 23:00:00 NaN
2018-11-19 00:00:00 3.19
2018-11-19 01:00:00 2.60
2018-11-19 02:00:00 2.29
2018-11-19 03:00:00 1.97
2018-11-19 04:00:00 2.19
2018-11-19 05:00:00 3.09
2018-11-19 06:00:00 4.32
2018-11-19 07:00:00 4.87
2018-11-19 08:00:00 5.14
2018-11-19 09:00:00 5.55
2018-11-19 10:00:00 6.34
2018-11-19 11:00:00 7.43
2018-11-19 12:00:00 8.18
2018-11-19 13:00:00 8.53
2018-11-19 14:00:00 8.45
2018-11-19 15:00:00 7.94
2018-11-19 16:00:00 6.87
2018-11-19 17:00:00 5.56
2018-11-19 18:00:00 4.65
2018-11-19 19:00:00 4.18
2018-11-19 20:00:00 3.97
2018-11-19 21:00:00 3.98
2018-11-19 22:00:00 4.01
2018-11-19 23:00:00 4.00

因此,例如,2018-11-18 00:00:00 的期望输出将是 9.12 和 3.19 = 6.16 的平均值。在 2018 年 11 月 18 日当天的其他时间以此类推。

在 pandas 中是否有一种简单的方法可以做到这一点?理想情况下,使用一种可以应用于数据框中的整个列(特征)的方法,而不必切出一些数据,对其进行转换,然后替换(因为老实说,这对我来说会快得多在 excel 中执行此操作!)。

提前感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe time-series interpolation


    【解决方案1】:

    试试:

    #make sure every hour is in the datetime
    df = df.set_index("datetime").resample("1h").last()
    
    #create a series of means averaging the values 24 hours before and after
    means = df["value"].shift(24).add(df["value"].shift(-24)).mul(0.5)
    
    #fill the NaN in df with means
    df["value"] = df["value"].combine_first(means)
    
    >>> df.iloc[24:48]
                         value
    datetime                  
    2018-11-18 00:00:00  6.155
    2018-11-18 01:00:00  5.770
    2018-11-18 02:00:00  5.485
    2018-11-18 03:00:00  5.080
    2018-11-18 04:00:00  4.970
    2018-11-18 05:00:00  5.220
    2018-11-18 06:00:00  5.685
    2018-11-18 07:00:00  5.710
    2018-11-18 08:00:00  5.720
    2018-11-18 09:00:00  5.915
    2018-11-18 10:00:00  6.510
    2018-11-18 11:00:00  7.535
    2018-11-18 12:00:00  8.395
    2018-11-18 13:00:00  8.985
    2018-11-18 14:00:00  9.145
    2018-11-18 15:00:00  8.780
    2018-11-18 16:00:00  7.520
    2018-11-18 17:00:00  5.860
    2018-11-18 18:00:00  5.290
    2018-11-18 19:00:00  4.770
    2018-11-18 20:00:00  4.330
    2018-11-18 21:00:00  4.170
    2018-11-18 22:00:00  4.345
    2018-11-18 23:00:00  4.430
    

    【讨论】:

    • 非常感谢!这看起来很棒。期待通过文档来确保我完全理解每种方法(并巩固我的理解和学习);然后尝试一下。
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多