Pandas 时间序列:计算每晚的平均值(晚上 11 点到早上 6 点之间)

Pandas timeseries : Compute the average each night (between 11 pm and 6 am)

我的数据是这样的:

datetime                  kwh             temperature
2021-03-01 23:00:00+01:00 1.276584        8.000000
2021-03-01 23:30:00+01:00 0.833173        8.000000
2021-03-02 00:00:00+01:00 1.480995        7.000000
2021-03-02 00:30:00+01:00 1.094157        8.000000
2021-03-02 01:00:00+01:00 1.221725        7.000000
2021-03-02 01:30:00+01:00 0.893175        6.000000
2021-03-02 02:00:00+01:00 0.663352        7.000000
2021-03-02 02:30:00+01:00 0.984540        6.500000
2021-03-02 03:00:00+01:00 1.332855        6.000000
2021-03-02 03:30:00+01:00 1.108477        6.000000
2021-03-02 04:00:00+01:00 1.219103        6.000000
2021-03-02 04:30:00+01:00 1.455885        5.000000
2021-03-02 05:00:00+01:00 1.758719        4.000000
2021-03-02 05:30:00+01:00 1.679657        4.000000
2021-03-02 23:00:00+01:00 2.482981        9.000000
2021-03-02 23:30:00+01:00 0.830652        8.000000
2021-03-03 00:00:00+01:00 0.673739       10.000000
2021-03-03 00:30:00+01:00 0.452588       10.000000
2021-03-03 01:00:00+01:00 0.790415        9.000000
...

我想在夜间汇总数据并计算 kwh 和温度的 sum() 和 mean()。

夜晚开始于23:00,结束于6:00(排除)。

输出必须是一个新的数据框,其中每一行代表一个晚上:

night            kwh_sum  kwh_mean  temperature_mean
2022-02-28       7.8      1.2       5.3
2022-03-01       10.5     2.3       6.7
2022-03-02       3.2      0.2       7.0
...

这是一种将一天的最后一个小时 D 和第二天的接下来的 6 小时 (D+1) 一起计算在 night = D 中的方法:

out = (
    df
    .assign(night=(df['datetime'] - pd.Timedelta('23h')).dt.tz_convert(None))
    .query('night.dt.hour < 7')
    .groupby(pd.Grouper(freq='D', key='night'))
    .agg({'kwh':[sum, 'mean'], 'temperature': ['mean']})
)
out.columns = ['_'.join(levels) for levels in out.columns]

关于您的数据样本:

              kwh_sum  kwh_mean  temperature_mean
night                                            
2021-03-01  14.892640  1.241053          6.041667
2021-03-02   1.916742  0.638914          9.666667