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
我有以下 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