it-swarm.com.de

Finden Sie das Datum, das einem bestimmten Datum am nächsten kommt

Ich habe ein Array von datetime-Objekten und möchte herausfinden, welches Element im Array einem bestimmten Datum am nächsten ist (z. B. datetime.datetime(2014,12,16)).

Dieses post zeigt, wie das nächstgelegene Datum gefunden wird, das nicht vor dem angegebenen Datum liegt. Wie kann ich diesen Code so ändern, dass er Datumsangaben zurückgibt, die vor einem bestimmten Datum liegen?

Wenn das Array beispielsweise die Elemente datetime.datetime(2014,12,10) und datetime.datetime(2014,12,28) beherbergt, sollte das vorherige Element zurückgegeben werden, da es dem absoluten Wert datetime.datetime(2014,12,16) am nächsten kommt.

27
user3600497

Diese Funktion gibt die datetime in items zurück, die dem Datum pivot am nächsten kommt.

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

Der gute Teil dieser Funktion funktioniert auch bei anderen Typen als datetime, wenn der Typ Vergleich, Subtraktion und abs unterstützt, z. B. Zahlen und Vektortypen.

57
Tamas Hegedus

Wie am dieser Link Link beantwortet, ist die Funktion "Abschneiden" für Sie da.

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

Oder Sie können get_loc mit der Option "am nächsten" verwenden.

df.iloc[df.index.get_loc(datetime.datetime(2016,02,02),method='nearest')]
22
Kevin Zhu
def nearestDate(base, dates):
    nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates }
    return nearness[min(nearness.keys())]
1
3442

Meine Lösung, um den nächstgelegenen Index anstelle des Wertes zu finden

def nearest_ind(items, pivot):
    time_diff = np.abs([date - pivot for date in items])
    return time_diff.argmin(0)
1

Um ein möglichst genaues Datum und zu finden, habe ich folgendes gemacht:

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, wie ich, eine Mindestschwelle für die Nähe zu Ihrer App haben.

0
Mark Matthews