繁体   English   中英

过滤 pandas 时间序列的最快方法是什么?

[英]What is the fastest way to filter a pandas time series?

过滤 pandas 时间序列的最快方法是什么? 现在我使用 boolean 掩码来过滤时间序列 ts:

import time
from datetime import datetime
import pandas as pd
import statistics

# create time series
idx = pd.date_range(start='2022-01-01', end='2023-01-01', freq="min")
ts = pd.Series(1, index=idx)

start_dt = datetime(2022, 1, 1, 0, 0, 0)
end_dt = datetime(2022, 1, 2, 0, 0, 0)

time_lst = []

# measure performance of boolean masking
for i in range(100):
    start = time.time()

    # 1st method
    mask = (ts.index > start_dt) & (ts.index <= end_dt)

    # 2nd method, nearly same velociy
    # mask = np.where((ts.index > start_dt) & (ts.index <= end_dt), True, False)

    time_lst.append(time.time() - start)

print(statistics.mean(time_lst))

filtered_ts = ts.loc[mask]

我想知道,如果这已经是最快的方法(这里每次运行 ~0.003 s)或者还有其他方法吗? 我对不同的start_dtend_dt使用了数千次掩码,它总结了我想要减少的重要时间。

您的解决方案非常快:

%timeit ts[(ts.index > start_dt) & (ts.index <= end_dt)]
5.02 ms ± 413 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


%timeit ts[ts.index.to_series().between(start_dt, end_dt, inclusive='left')]
8.22 ms ± 160 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

但是,如果可能的话,使用Series.loc包含两个日期时间的更改解决方案会更快:

%timeit ts[(ts.index >= start_dt) & (ts.index <= end_dt)]

%timeit ts.loc[start_dt:end_dt]
138 µs ± 1.51 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM