在排序的 pandas 数据框中按时间戳搜索元素

2023-12-19

我有一个非常大的熊猫数据框/系列,包含数百万个元素。 我需要找到时间戳小于 t0 的所有元素。 所以通常我会做的是:

selected_df = df[df.index < t0]

这需要很长时间。据我了解,当 pandas 搜索时,它会遍历数据帧的每个元素。但是我知道我的数据帧已排序,因此只要时间戳> t0,我就可以打破循环。我假设 pandas 不知道数据帧已排序并搜索所有时间戳。

我尝试使用 pandas.Series 代替 - 仍然很慢。 我尝试编写自己的循环,例如:

boudery = 0
ticks_time_list = df.index
tsearch = ticks_time_list[0]
while tsearch < t0:
      tsearch = ticks_time_list[boudery]
      boudery += 1      
selected_df = df[:boudery]

这比 pandas 搜索花费的时间还要长。 我能看到 atm 的唯一解决方案是使用 Cython。 有什么想法可以在不涉及 C 的情况下对其进行排序吗?


即使框架很长,对我来说似乎也不需要很长时间:

>>> df = pd.DataFrame({"A": 2, "B": 3}, index=pd.date_range("2001-01-01", freq="1 min", periods=10**7))
>>> len(df)
10000000
>>> %timeit df[df.index < "2001-09-01"]
100 loops, best of 3: 18.5 ms per loop

但如果我们真的想榨干每一滴性能,我们可以使用searchsorted http://docs.scipy.org/doc/numpy/reference/generated/numpy.searchsorted.html下降到后的方法numpy:

>>> %timeit df.iloc[:df.index.values.searchsorted(np.datetime64("2001-09-01"))]
10000 loops, best of 3: 51.9 µs per loop
>>> df[df.index < "2001-09-01"].equals(df.iloc[:df.index.values.searchsorted(np.datetime64("2001-09-01"))])
True

这要快很多倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在排序的 pandas 数据框中按时间戳搜索元素 的相关文章