如何使用Python Pandas获取特定日期时间索引后最接近的单行

Joh*_*ell 15 python pandas

DataFrame我有:

            A   B   C 
2012-01-01  1   2   3 
2012-01-05  4   5   6 
2012-01-10  7   8   9 
2012-01-15  10  11  12 
Run Code Online (Sandbox Code Playgroud)

我现在用的是:

date_after = dt.datetime( 2012, 1, 7 )
frame.ix[date_after:].ix[0:1]
Out[1]: 
            A  B  C
2012-01-10  7  8  9
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我不喜欢我必须指定.ix [0:1]而不是.ix [0],但如果我不指望输出更改为TimeSeries而不是DataFrame中的单行.我发现在原始DataFrame上使用旋转的TimeSeries更加困难.

没有.ix[0:1]:

frame.ix[date_after:].ix[0]
Out[1]: 
A    7
B    8
C    9
Name: 2012-01-10 00:00:00
Run Code Online (Sandbox Code Playgroud)

谢谢,

约翰

Wes*_*ney 30

你可能想直接去做索引:

i = frame.index.searchsorted(date)
frame.ix[frame.index[i]]
Run Code Online (Sandbox Code Playgroud)

触摸详细,但你可以把它放在一个功能.大约和你一样好(O(log n))


Kev*_*Zhu 20

无法抗拒回答这个问题,尽管问题是在2012年由Wes本人提出并在2015年由ajsp回答.是的,除了"截",你也可以使用get_loc与选项"nearst"

df.iloc[df.index.get_loc(datetime.datetime(2016,02,02),method='nearest')]
Run Code Online (Sandbox Code Playgroud)

  • 这就是我想要的答案.但看起来"最近"可能会返回*previous*行."回填"似乎返回了最接近的. (4认同)
  • 你这个厚脸皮的猴子。 (2认同)

ajs*_*jsp 5

即使我们在2012年由韦斯本人提出并回答了这个问题,也无法拒绝回答。是的,只需使用截断即可。

df.truncate(before='2012-01-07')
Run Code Online (Sandbox Code Playgroud)