python - 确保 Pandas 数据框中连续观察之间的最小时间间隔

标签 python pandas dataframe indexing

我有一个按日期列排序的 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/

相关文章:

php - python 等同于 PHP $_SERVER 是什么?

python - 如何在 Pandas 数据框中按日期汇总所有金额?

python - 如何在 iPython 中使用 pandas 库读取 .xlsx 文件?

r - 添加两个不同大小和子集的数据框

python - 计算两个 Pandas 数据帧的行之间的欧几里得距离

python-3.x - 将值附加到特定的 DataFrame 单元格

python - 扭曲的日志记录到屏幕(标准输出)不起作用

java - Python 的生成器与 Java 中的生成器类似

python - 如何监听 (S)FTP 服务器上的更改?

python - 如何在不连接的情况下读取 Python 数据框中的数据?