Pandas: 营业时间滚动统计

Pandas: Rolling statistics with business hours

我有以下 table 用时间戳索引。

数据是在上午 8 点到晚上 11 点的工作时间内,但会持续多天

当我执行像平均值这样的滚动统计,并将时间段指定为 24 小时时,window 从 1 月 5 日重叠到 1 月 4 日。

具体来说,我想知道如何有效地执行滚动周期以仅包括 window 中的当天。

我目前低效的方法是创建一个自定义函数,为每次滚动计算选择有效的时间戳索引,但这非常慢。

def mean(x):
    x = x[(x.index.hour >= 8) & (x.index.hour <= 23)]
    return 100.0 * (sum(x) / (len(x)))

索引 价值 正常 需要
2021-01-0408:35:15 0 0 0
2021-01-0410:35:45 0 0 0
2021-01-0416:35:30 1 0.333 0.333
2021-01-0421:35:00 1 0.5 0.5
2021-01-0508:15:00 1 0.6 1.0
2021-01-0508:35:15 0 0.5 0.5
2021-01-0512:35:42 0 0.428 0.333
2021-01-0514:35:24 1 0.5 0.5
2021-01-0420:35:23 0 0.444 0.4

您可以通过将 groupby 操作与窗口操作链接起来来获得所需的结果。根据 documentation 这将“首先按指定键对数据进行分组,然后对每组执行窗口操作”。

In [711]: df.groupby(lambda x: x.date()).rolling('1D').mean().reset_index(0, drop=True)
Out[711]:
                        Value
2021-01-04 08:35:15  0.000000
2021-01-04 10:35:45  0.000000
2021-01-04 16:35:30  0.333333
2021-01-04 21:35:00  0.500000
2021-01-05 08:15:00  1.000000
2021-01-05 08:35:15  0.500000
2021-01-05 12:35:42  0.333333
2021-01-05 14:35:24  0.500000
2021-01-05 20:35:23  0.400000