我有一个按日期列排序的 pandas 数据框。然而,我希望确保观察之间的最小时间间隔。为简单起见,该窗口为 10 分钟,这意味着如果我的第一次观察发生在上午 8:05,那么第二次观察必须至少发生在上午 8:15。必须从数据帧中删除上午 8:05-8:15 之间发生的任何观察结果。不失一般性地说,在放弃观察后,第二次观察发生在上午 8:17。然后,删除上午 8:17-8:27 之间的所有观测值以查找第三个数据点,并继续此过程。
我有一个脚本可以工作,但是一次迭代一行,并且由于数据帧有数十万行,速度非常慢。我当前的脚本(窗口是以分钟为单位的最小阈值):
cur_time = df.iloc[0].Date
for idx, row in df[1:].iterrows():
time_diff = (row.Date - cur_time).total_seconds()
if time_diff > window*60:
cur_time = row.Date
else:
trades_df.drop(idx, inplace=True)
有人能想到一种速度更优化的方法来执行此操作吗?如果我切换到日期列作为索引,是否有现成的函数可用于执行此功能?
编辑:经过进一步研究,我正在寻找的函数类似于 df.resample(window + 'M').first()。然而,使用它的问题是我的数据集间隔稀疏。 IE。我没有每分钟的数据,数据点之间的间隔可能是 1 秒,也可能是 1 个月。
最佳答案
根据评论中提到的情况,我认为您无法对整个代码进行矢量化。但是,您可以更快地浏览数据集:
window = 10
# convert date as numpy array (in seconds)
arr = df['Date'].values.astype(float) / 1e9
# compute dense matrix using numpy broadcasting
m = arr - arr[:, None] > window * 60
locs = [] # list of valid observations
idx = 0 # first date is always valid
while True:
# append the current observation
locs.append(idx)
if m[idx].sum() == 0:
# no more observations to check
break
# next valid observation
idx = np.argmax(m[idx])
out = df.iloc[locs]
输出:
>>> out
Date
0 2023-06-01 00:02:10
3 2023-06-01 00:14:20
8 2023-06-01 00:24:42
11 2023-06-01 00:35:35
13 2023-06-01 00:48:39
>>> locs
[0, 3, 8, 11, 13]
Minimal Reproducible Example :
import numpy as np
import pandas as pd
np.random.seed(42)
offsets = pd.to_timedelta(np.random.randint(0, 60*60, 20), unit='S')
df = (pd.DataFrame({'Date': pd.Timestamp('2023-06-01') + offsets})
.sort_values('Date', ignore_index=True))
print(df)
# Output
Date
0 2023-06-01 00:02:10 # OK, first value is always valid
1 2023-06-01 00:05:30
2 2023-06-01 00:07:46
3 2023-06-01 00:14:20 # OK, 00:02:10 + 10min < 00:14:20
4 2023-06-01 00:18:15
5 2023-06-01 00:18:50
6 2023-06-01 00:20:38
7 2023-06-01 00:21:34
8 2023-06-01 00:24:42 # OK, 00:14:20 + 10min < 00:24:42
9 2023-06-01 00:27:18
10 2023-06-01 00:28:05
11 2023-06-01 00:35:35 # OK, 00:24:42 + 10min < 00:35:35
12 2023-06-01 00:36:09
13 2023-06-01 00:48:39 # OK, 00:35:35 + 10min < 00:48:39
14 2023-06-01 00:51:32
15 2023-06-01 00:52:51
16 2023-06-01 00:52:54
17 2023-06-01 00:56:20
18 2023-06-01 00:57:24
19 2023-06-01 00:58:27
关于python - 确保 Pandas 数据框中连续观察之间的最小时间间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76381633/