查找最近的索引值的最快方法



考虑时间序列s及其索引tidx

tidx = pd.date_range('2010-12-31', periods=3, freq='M')
s = pd.Series([0, 31, 59], tidx)

如果我想使用s作为查找序列并传递日期'2011-02-23',我想获得最近可用的值。在本例中是31

我做过

s.resample('D').ffill().loc['2011-02-23']
31

这可以完成工作,但是我必须重新采样整个序列才能获得单个值。什么是更合适的方式来做到这一点?

您可以使用searchsorted -

s[s.index.searchsorted('2011-02-23','right')-1]

乐趣是当你打败自己!所以,这里有更多的NumPy加入到进一步的性能提升中-

s[s.index.values.searchsorted(np.datetime64('2011-02-23'),'right')-1]

运行测试-

In [235]: tidx = pd.date_range('2010-12-31', periods=300, freq='M')
     ...: s = pd.Series(range(300), tidx)
     ...: 
In [236]: s[s.index.searchsorted('2035-03-23','right')-1]
Out[236]: 290
In [237]: s[s.index.values.searchsorted(np.datetime64('2035-03-23'),'right')-1]
Out[237]: 290
In [238]: %timeit s[s.index.searchsorted('2035-03-23','right')-1]
10000 loops, best of 3: 63 µs per loop
In [239]: %timeit s[s.index.values.searchsorted(np.datetime64('2035-03-23'),'right')-1]
10000 loops, best of 3: 46.7 µs per loop

这个怎么样?

In [150]: s[s.index <= '2011-02-23'].tail(1)
Out[150]:
2011-01-31    31
Freq: M, dtype: int64

我用的是s.index.get_loc()

文档

它允许找到"最近"的索引值位置。

s.iloc[s.index.get_loc('2011-02-23', 'ffill')]

相关内容