2012-03-26 13 views
14

Datenrahmen bekommen ich habe:Wie die nächste einzelne Zeile nach einem bestimmten Datetime-Index mit 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 

Was ich jetzt benutze:

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 

Gibt es einen besseren Weg, dies zu tun ? Ich mag es nicht, dass ich .ix [0: 1] anstelle von .ix [0] angeben muss, aber wenn ich nicht die Ausgabe zu einer TimeSeries anstatt einer einzelnen Zeile in einem DataFrame ändert. Ich finde es schwieriger, mit einer gedrehten TimeSeries-Version über dem ursprünglichen DataFrame zu arbeiten.

Ohne .ix[0:1]:

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

Danke,

John

Antwort

27

Sie könnten den Index direkt tun hinwollen:

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

Ein Hauch ausführliche, aber man könnte es ausdrückte in einer Funktion. Ungefähr so ​​gut wie du wirst (O(log n))

+5

Beliebige Dokumente für diese? – Pablojim

+0

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

3

Konnte nicht widerstehen, dies zu beantworten, obwohl die Frage 2012 von Wes selbst gestellt und beantwortet wurde. Ja, benutze nur truncate.

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

kann nicht widerstehen diese zu beantworten, auch wenn die Frage gestellt wurde, und antwortete, im Jahr 2012, von Wes selbst, und im Jahr 2015 wieder von AJSP. Ja, neben 'trunkate' können Sie auch get_loc mit der Option 'nearst' verwenden

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

Dies ist die Antwort, die ich möchte. Aber es sieht so aus, als könnte "am nächsten" eine * vorherige * Zeile zurückgeben. "Backfill" scheint am nächsten zu sein. – Ian