Jak zapytać o najbliższy indeks z dataframe Pandas? Indeks jest 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

Próbowałem tego:

df.index.get_loc(df.index[0], method='nearest')

Ale daje mi InvalidIndexError: Reindexing only valid with uniquely valued Index objects

Ten sam błąd, jeśli spróbuję tego:

dt =datetime.datetime.strptime("2016-11-13 22:01:25", "%Y-%m-%d %H:%M:%S")
df.index.get_loc(dt, method='nearest')

Ale jeśli usunę method='nearest' Działa, ale to nie chcę, chcę znaleźć najbliższy indeks z datetime zapytania

37
Bryan Fok 16 luty 2017, 07:17

2 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że potrzebujesz najpierw zdobądź pozycję przez get_loc, a następnie wybierz []:

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
37
jezrael 16 luty 2017, 06:28

Wierzę, że działa rozwiązanie Jezrael, ale nie na mojej dataframe (której nie mam wskazówki Dlaczego). To jest rozwiązanie, z którym wymyśliłem.

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
Bryan Fok 16 luty 2017, 06:52