Вычисление скользящего окна размером 8 часов с использованием получасовых приращений в 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 часов по этим данным и подсчитать количество отправлений в этом окне. Единственная сложность заключается в том, что я хочу, чтобы каждое окно вычислялось каждые полчаса, поэтому, например, первое окно может быть с 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-часового окна, но вместо этого индекс представляет собой целое число, чего я не понимаю. Кроме того, поскольку я указал 8h, я подозреваю, что окно вычисляется каждые 8 ​​часов, а не каждые полчаса, но я не уверен.

Как я могу подсчитать события в скользящем окне, частота которого отличается от размера окна, а затем как я могу получить результаты в формате, индексированном по дате?

У меня Python 3.9.1 и панды 1.2.0.


person Migwell    schedule 12.01.2021    source источник


Ответы (1)


Один из способов — сначала resample кадр данных должен иметь ту же частоту, что и желаемый размер шага (в данном случае 30 минут). Затем вы можете использовать rolling с размер окна 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()

Получившаяся серия панд:

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
person Shaido    schedule 12.01.2021