在python/pandas中,如何搜索最近的值?

在python/pandas中,如何搜索最近的值?,python,numpy,pandas,Python,Numpy,Pandas,我有一个这样的数组 sp500=Quandl.get("YAHOO/INDEX_GSPC") Open High Low Close Volume Adjusted Close returns vols Date 1950-05-26 18.67 18.67 18.67 18.67 1330000 18.67 -0.001070 0.091246 19

我有一个这样的数组

sp500=Quandl.get("YAHOO/INDEX_GSPC")


    Open    High    Low     Close   Volume  Adjusted Close  returns     vols
Date                                
1950-05-26  18.67   18.67   18.67   18.67   1330000     18.67   -0.001070   0.091246
1950-05-29  18.72   18.72   18.72   18.72   1110000     18.72   0.002678    0.078494
1950-05-31  18.78   18.78   18.78   18.78   1530000     18.78   0.003205    0.073638
1950-06-01  18.77   18.77   18.77   18.77   1580000     18.77   -0.000532   0.069189
1950-06-02  18.79   18.79   18.79   18.79   1450000     18.79   0.001066    0.059300
在任何日期,我都想找出vol低于5%的天数。例如,在1950年5月26日,我将开始向后搜索,直到我找到一个小于5%的vol,并计算那天和1950年5月26日之间的日差。确切的功能是简单的“天”,因为这发生了

有没有更简单的方法


我想到的是使用np.where(x假设您的数据帧在索引中排序,您可以组合
numpy.where
Series.fillna
,以获得低于某个阈值的卷的最后一天。例如,从

>>> df
             vols
Date             
2014-07-10  0.045
2014-07-11  0.057
2014-07-12  0.064
2014-07-13  0.003
2014-07-14  0.021
2014-07-15  0.052
2014-07-16  0.090
这将是

>>> df['tick'] = np.where(df.vols < .05, df.index, pd.tslib.NaT)
>>> df
             vols        tick
Date                         
2014-07-10  0.045  2014-07-10
2014-07-11  0.057         NaN
2014-07-12  0.064         NaN
2014-07-13  0.003  2014-07-13
2014-07-14  0.021  2014-07-14
2014-07-15  0.052         NaN
2014-07-16  0.090         NaN
请注意,您需要在最后一步中使用
.values
,否则
-
将执行某种设置差异操作

>>> df['tick'].fillna(method='ffill', inplace=True)
>>> df
             vols        tick
Date                         
2014-07-10  0.045  2014-07-10
2014-07-11  0.057  2014-07-10
2014-07-12  0.064  2014-07-10
2014-07-13  0.003  2014-07-13
2014-07-14  0.021  2014-07-14
2014-07-15  0.052  2014-07-14
2014-07-16  0.090  2014-07-14

>>> df['days'] = df.index.values - df['tick']
>>> df
             vols        tick   days
Date                                
2014-07-10  0.045  2014-07-10 0 days
2014-07-11  0.057  2014-07-10 1 days
2014-07-12  0.064  2014-07-10 2 days
2014-07-13  0.003  2014-07-13 0 days
2014-07-14  0.021  2014-07-14 0 days
2014-07-15  0.052  2014-07-14 1 days
2014-07-16  0.090  2014-07-14 2 days