假设我有一个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
和我知道的特定日期在我的索引中,但不知道其位置,例如
cur_dt = df.index[np.random.randint(0, df.index.size)]
>>> cur_dt
Timestamp('2017-04-05 00:00:00', freq='D')
鉴于cur_dt
,我想确定索引中的上一个和下一个值是什么。 cur_dt
应该是我的索引中的第一个(最后一个)值,那么前一个(下一个)元素本身应该是cur_dt
。
回顾一下,我的问题是,在给定当前值的情况下,找到索引中的上一个和下一个值(或者如果它是一个端点的当前值本身)的最简单方法是什么? / p>
我目前的做法似乎相当迂回,这是我提出要求的动机。
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')
如果没有更直接的方式,那么我的道歉。我想象能够将我的索引从我的当前值“转移”一次向前和向后移动(对端点有一些很好的处理),但我不确定这是否可行。
答案 0 :(得分: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')
<强>解决方案:强>
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')
答案 1 :(得分:1)
重置索引,然后使用布尔逻辑来识别cur_dt
的位置,如下所示:
df = df.reset_index()
cur_dt_index = df.index[np.random.randint(0, df['index'].size)]
previous = max(cur_dt_index-1, 0)
next = min(cur_dt_index + 1, df.shape[0])
答案 2 :(得分:0)
创建一个与df具有相同索引的新时间序列ts,它将存储先前的索引(并确保ts的索引已排序),然后将ts移位1。
ts=pd.Series(df.index,index=df.index).sort_index().shift(1)
(如果您只需要查找一次上一个索引,可能会比较慢,但是如果需要多次查找,则可能会更快。)