如果存在,则在DataFrame中获取上一个和下一个索引值

Eri*_*sen 3 python dataframe pandas

假设我有一个DataFrame

df = pd.DataFrame(dict(vals=np.random.randint(0, 10, 10)),
                  index=pd.date_range('20170401', '20170410'))

>>> df
               vals
2017-04-01     9
2017-04-02     8
2017-04-03     4
2017-04-04     5
2017-04-05     9
2017-04-06     9
2017-04-07     5
2017-04-08     3
2017-04-09     3
2017-04-10     1
Run Code Online (Sandbox Code Playgroud)

例如,我所知道的特定日期在我的索引中,但不知道其位置

cur_dt = df.index[np.random.randint(0, df.index.size)]

>>> cur_dt
Timestamp('2017-04-05 00:00:00', freq='D')
Run Code Online (Sandbox Code Playgroud)

鉴于cur_dt,我想确定索引中的上一个和下一个值是什么.应该cur_dt是我的索引中的第一个(最后一个)值,那么前一个(下一个)元素应该是cur_dt它自己.

回顾一下,我的问题是,在给定当前值的情况下,找到索引中的上一个和下一个值(或者如果它是一个端点的当前值本身)的最简单方法什么?


我目前的做法似乎相当迂回,这是我提出要求的动机.

cur_iloc = df.index.get_loc(cur_dt)
prev = cur_dt if cur_iloc == 0 else df.index[cur_iloc-1]
next = cur_dt if cur_iloc == df.index.size-1 else df.index[cur_iloc+1]

>>> prev
Timestamp('2017-04-04 00:00:00', freq='D')
>>> next
Timestamp('2017-04-06 00:00:00', freq='D')
Run Code Online (Sandbox Code Playgroud)

如果没有更直接的方式,那么我的道歉.我想象能够将我的索引从我的当前值"转移"一次向前和向后移动(对端点有一些很好的处理),但我不确定这是否可行.

Max*_*axU 5

假设索引已排序,请尝试使用numpy.searchsorted:

来源数据集:

In [185]: df
Out[185]:
            vals
2017-04-01     5
2017-04-02     3
2017-04-03     9
2017-04-04     8
2017-04-05     1
2017-04-06     0
2017-04-07     4
2017-04-08     5
2017-04-09     1
2017-04-10     8

In [186]: cur_dt
Out[186]: Timestamp('2017-04-02 00:00:00', freq='D')
Run Code Online (Sandbox Code Playgroud)

解:

In [187]: idx = np.searchsorted(df.index, cur_dt)

In [188]: df.index[max(0, idx-1)]
Out[188]: Timestamp('2017-04-01 00:00:00', freq='D')

In [189]: df.index[min(idx+1, len(df)-1)]
Out[189]: Timestamp('2017-04-03 00:00:00', freq='D')
Run Code Online (Sandbox Code Playgroud)