计算 8 小时大小的滚动 window,使用 pandas 中的半小时增量
Calculating a rolling window of 8 hour size, using half hour increments in pandas
我有一个包含以下日期列的数据框:
scheduled_departure_utc
run_id
0
2021-01-11 13:07:00+00:00
13149
128
2021-01-11 13:07:00+00:00
38138
1
2021-01-11 13:37:00+00:00
13153
129
2021-01-11 13:37:00+00:00
38139
2
2021-01-11 18:07:00+00:00
951600
130
2021-01-11 18:07:00+00:00
951600
3
2021-01-11 18:22:00+00:00
951780
131
2021-01-11 18:22:00+00:00
951780
132
2021-01-11 18:26:00+00:00
951201
4
2021-01-11 18:37:00+00:00
951802
我想在此数据上移动 8 小时宽度的滚动 window,并计算该 window 中的出发次数。唯一棘手的是我希望每个 window 每半小时计算一次,因此例如第一个 window 可能来自 00:00-08:00,然后是 00:30 -08:30,然后 01:00-09:00 等
使用 pandas 我可以执行以下操作:
train_window = df.rolling('8h', on='scheduled_departure_utc').run_id.count()
然而,这给了我一个令人困惑的结果。数据框如下所示:
run_id
0
1
128
2
1
3
129
4
2
5
130
6
3
7
131
8
132
9
4
10
我本来希望有一个数据框,其索引是 8 小时开始的日期时间window,但索引是一个整数,我不明白。另外,因为我指定了 8h
,我怀疑 window 每 8 小时而不是每半小时计算一次,但我不确定。
如何计算滚动 window 中的事件,其频率与 window 的大小不同,然后如何获得日期索引格式的结果?
我在 Python 3.9.1 和 pandas 1.2.0。
一种方法是首先 resample
数据帧具有与您想要的步长相同的频率(在本例中为 30 分钟)。
然后您可以使用 rolling
,window 大小为 16(即 8 小时)。
df['scheduled_departure_utc'] = pd.to_datetime(df['scheduled_departure_utc'])
df.set_index('scheduled_departure_utc').resample('30T').count()['run_id'].rolling(window=16, min_periods=1).sum()
结果 pandas 系列:
2021-01-11 13:00:00 2.0
2021-01-11 13:30:00 4.0
2021-01-11 14:00:00 4.0
2021-01-11 14:30:00 4.0
2021-01-11 15:00:00 4.0
2021-01-11 15:30:00 4.0
2021-01-11 16:00:00 4.0
2021-01-11 16:30:00 4.0
2021-01-11 17:00:00 4.0
2021-01-11 17:30:00 4.0
2021-01-11 18:00:00 9.0
2021-01-11 18:30:00 10.0
我有一个包含以下日期列的数据框:
scheduled_departure_utc | run_id | |
---|---|---|
0 | 2021-01-11 13:07:00+00:00 | 13149 |
128 | 2021-01-11 13:07:00+00:00 | 38138 |
1 | 2021-01-11 13:37:00+00:00 | 13153 |
129 | 2021-01-11 13:37:00+00:00 | 38139 |
2 | 2021-01-11 18:07:00+00:00 | 951600 |
130 | 2021-01-11 18:07:00+00:00 | 951600 |
3 | 2021-01-11 18:22:00+00:00 | 951780 |
131 | 2021-01-11 18:22:00+00:00 | 951780 |
132 | 2021-01-11 18:26:00+00:00 | 951201 |
4 | 2021-01-11 18:37:00+00:00 | 951802 |
我想在此数据上移动 8 小时宽度的滚动 window,并计算该 window 中的出发次数。唯一棘手的是我希望每个 window 每半小时计算一次,因此例如第一个 window 可能来自 00:00-08:00,然后是 00:30 -08:30,然后 01:00-09:00 等
使用 pandas 我可以执行以下操作:
train_window = df.rolling('8h', on='scheduled_departure_utc').run_id.count()
然而,这给了我一个令人困惑的结果。数据框如下所示:
run_id | |
---|---|
0 | 1 |
128 | 2 |
1 | 3 |
129 | 4 |
2 | 5 |
130 | 6 |
3 | 7 |
131 | 8 |
132 | 9 |
4 | 10 |
我本来希望有一个数据框,其索引是 8 小时开始的日期时间window,但索引是一个整数,我不明白。另外,因为我指定了 8h
,我怀疑 window 每 8 小时而不是每半小时计算一次,但我不确定。
如何计算滚动 window 中的事件,其频率与 window 的大小不同,然后如何获得日期索引格式的结果?
我在 Python 3.9.1 和 pandas 1.2.0。
一种方法是首先 resample
数据帧具有与您想要的步长相同的频率(在本例中为 30 分钟)。
然后您可以使用 rolling
,window 大小为 16(即 8 小时)。
df['scheduled_departure_utc'] = pd.to_datetime(df['scheduled_departure_utc'])
df.set_index('scheduled_departure_utc').resample('30T').count()['run_id'].rolling(window=16, min_periods=1).sum()
结果 pandas 系列:
2021-01-11 13:00:00 2.0
2021-01-11 13:30:00 4.0
2021-01-11 14:00:00 4.0
2021-01-11 14:30:00 4.0
2021-01-11 15:00:00 4.0
2021-01-11 15:30:00 4.0
2021-01-11 16:00:00 4.0
2021-01-11 16:30:00 4.0
2021-01-11 17:00:00 4.0
2021-01-11 17:30:00 4.0
2021-01-11 18:00:00 9.0
2021-01-11 18:30:00 10.0