2015-08-26 16 views
16

ich ein Array von Datetime-Objekte haben, und ich möchte, welches Element im Array zu finden, ist in der Nähe von einem bestimmten Zeitpunkt (zB datetime.datetime(2014,12,16))Finden Sie den nächsten Tag zu einem bestimmten Zeitpunkt

This Beitrag zeigt, wie finden Sie das nächste Datum , die nicht vor dem angegebenen Datum ist. Wie kann ich diesen Code ändern, sodass er Daten zurückgeben kann, die vor einem bestimmten Datum liegen? Wenn das Array die Elemente datetime.datetime(2014,12,10) und datetime.datetime(2014,12,28) enthält, sollte das vorherige Element zurückgegeben werden, da es datetime.datetime(2014,12,16) absolut am nächsten ist.

+0

Vielleicht könnten Sie versuchen, die Daten zu sortieren und dann den Index vor und nach dem Datum zu überprüfen, das Sie betrachten und sehen, welches näher dran ist? – Zarwan

+0

Momentan verwende ich 'np.argwhere', um alle Elemente vor und nach dem angegebenen Datum zu finden und das letzte der ersten Elemente zu übernehmen. Das Problem ist, manchmal gibt es keine Termine nach dem 16. Dezember 2014 im Array, was ein Problem in meinem Skript ist. Es wäre viel einfacher, das nächste Datum zu finden. – user3600497

+0

Sie können die Verwendung von [truncate] (http://stackoverflow.com/questions/9877391/how-to-get-the-closest-single-row-after-a-specific-datetime-index-using-python-p) Funktion. –

Antwort

34

Diese Funktion wird die datetime in items zurück, die pivot die am nächsten zu dem aktuellen Stand ist.

def nearest(items, pivot): 
    return min(items, key=lambda x: abs(x - pivot)) 

Das gute Teil dieser Funktion auf andere Arten als datetime auch aus der Box funktioniert, wenn der Typ Vergleich unterstützt, Subtraktion und abs, z.B .: Zahlen und Vektortypen.

+1

Einfachheit in seiner schönsten Form. Groß. –

+0

Wow, ordentlich! Vielleicht ist es etwas, was meine Bigramm-Methode zu reproduzieren versucht, aber viel kürzer. –

+0

Einfach elegant! – artDeco

1
def nearestDate(base, dates): 
    nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates } 
    return nearness[min(nearness.keys())] 
11

Wie auf this link Link beantwortet, 'truncate' Funktion ist für Sie da.

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

Oder können Sie get_loc mit 'nächste' Option verwenden.

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

Um einen nächsten Termin zu finden und die Timedelta (Differenz zwischen zwei Daten) kehre ich folgendes getan:

def nearest_date(items,pivot): 
    nearest=min(items, key=lambda x: abs(x - pivot)) 
    timedelta = abs(nearest - pivot) 
    return nearest, timedelta 

Dies kann nützlich sein, wenn Sie eine Mindestschwelle für Nähe haben für Ihre App wie ich es tat.

+0

Dank @TamasHegedus –

Verwandte Themen