在 pandas 中使用半小时增量计算 8 小时大小的滚动窗口

Posted

技术标签:

【中文标题】在 pandas 中使用半小时增量计算 8 小时大小的滚动窗口【英文标题】:Calculating a rolling window of 8 hour size, using half hour increments in pandas 【发布时间】:2021-04-17 04:32:48 【问题描述】:

我有一个包含以下日期列的数据框:

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等

使用熊猫我可以做到以下几点:

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 和 pandas 1.2.0。

【问题讨论】:

【参考方案1】:

一种方法是首先resample 数据帧具有与您想要的步长相同的频率(在本例中为 30 分钟)。 然后您可以使用窗口大小为 16(即 8 小时)的rolling

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

【讨论】:

以上是关于在 pandas 中使用半小时增量计算 8 小时大小的滚动窗口的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV高手勿入! 半小时学会基本操作 8 ROI & 泛洪

熊猫时间增量只有小时分钟和秒

sql语句! 8小时为一天! 半小时为准,分钟不满半小时按半小时算!

Mysql/ Grafana 计算/显示最后一小时/天/周/月的重量增量/减量

OpenCV ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法

OpenCV ⚠️高手勿入! 半小时学会基本操作 24⚠️ SIFT 算法