2012-03-26 14 views
14

dataframe ho:Come ottenere la fila singola più vicino dopo uno specifico indice di datetime utilizzando Python Pandas

  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 

quello che sto usando ora:

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 

c'è un modo migliore di fare questo ? Non mi piace che io debba specificare .ix [0: 1] invece di .ix [0], ma se non lo faccio l'output cambia in TimeSeries invece di una singola riga in un DataFrame. Trovo più difficile lavorare con TimeSeries ruotato in cima al DataFrame originale.

Senza .ix[0:1]:

frame.ix[date_after:].ix[0] 
Out[1]: 
A 7 
B 8 
C 9 
Name: 2012-01-10 00:00:00 

Grazie,

John

risposta

27

Si potrebbe desiderare di andare direttamente fare l'indice:

i = frame.index.searchsorted(date) 
frame.ix[frame.index[i]] 

Un tocco prolisso, ma si potrebbe mettere in una funzione. Circa buono (O(log n))

+5

Qualsiasi documento per questo? – Pablojim

+0

@Pablojim: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.searchsorted.html?highlight=searchsorted#pandas.Index.searchsorted – naught101

3

Non ho potuto resistere a rispondere a questo, anche se la domanda è stata posta, e ha risposto, nel 2012, dallo stesso Wes. Sì, basta usare tronca.

df.truncate(before='2012-01-07') 
12

non ha potuto resistere rispondere a questa, anche se la questione è stato chiesto, e ha risposto, nel 2012, da Wes se stesso, e di nuovo nel 2015, per AJSP. Sì, oltre a 'truncate', puoi anche utilizzare get_loc con l'opzione 'nearst'

df.iloc[df.index.get_loc(datetime.datetime(2016,02,02),method='nearest')] 
+1

Questa è la risposta che voglio. Ma sembra che "più vicino" possa restituire una * precedente * riga. "backfill" sembra restituire il più vicino dopo. – Ian

Problemi correlati