如何从Pandas DataFrame查询最近的索引?索引是DatetimeIndex
2016-11-13 20:00:10.617989120 7.0 132.0
2016-11-13 22:00:00.022737152 1.0 128.0
2016-11-13 22:00:28.417561344 1.0 132.0
我试过了:
df.index.get_loc(df.index[0], method='nearest')
但它给了我InvalidIndexError: Reindexing only valid with uniquely valued Index objects
如果我尝试了同样的错误:
dt =datetime.datetime.strptime("2016-11-13 22:01:25", "%Y-%m-%d %H:%M:%S")
df.index.get_loc(dt, method='nearest')
但如果我删除method='nearest'
它可以正常工作,但这不是我想要的,我想找到与查询日期时间最接近的索引
答案 0 :(得分:17)
您似乎需要先get_loc
获取排名,然后按[]
选择:
dt = pd.to_datetime("2016-11-13 22:01:25.450")
print (dt)
2016-11-13 22:01:25.450000
print (df.index.get_loc(dt, method='nearest'))
2
idx = df.index[df.index.get_loc(dt, method='nearest')]
print (idx)
2016-11-13 22:00:28.417561344
#if need select row to Series use iloc
s = df.iloc[df.index.get_loc(dt, method='nearest')]
print (s)
b 1.0
c 132.0
Name: 2016-11-13 22:00:28.417561344, dtype: float64
答案 1 :(得分:1)
我相信jezrael解决方案可行,但不适用于我的数据框(我不知道为什么)。这是我提出的解决方案。
from bisect import bisect #operate as sorted container
timestamps = np.array(df.index)
upper_index = bisect(timestamps, np_dt64, hi=len(timestamps)-1) #find the upper index of the closest time stamp
df_index = df.index.get_loc(min(timestamps[upper_index], timestamps[upper_index-1],key=lambda x: abs(x - np_dt64))) #find the closest between upper and lower timestamp
答案 2 :(得分:0)
我知道这是一个老问题,但是在寻找与Bryan Fok相同的问题时,我降落在这里。因此,对于将来的搜索者来说,我发布了解决方案。 我的索引有4个非唯一项(可能是由于记录数据时的舍入错误)。以下工作可以显示正确的数据:
dt = pd.to_datetime("2016-11-13 22:01:25.450")
s = df.loc[df.index.unique()[df.index.unique().get_loc(dt, method='nearest')]]
但是,如果最近的索引多次出现,则会返回多行。如果您想抓住它,可以使用以下方法进行测试:
if len(s) != len(df.columns):
# do what is appropriate for your case
# e.g. selecting only the first occurence
s.iloc[0]
编辑:修复了一些测试后的问题