[英]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_dt和end_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.