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.
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.
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')]
def nearestDate(base, dates):
nearness = { abs(base.timestamp() - date.timestamp()) : date for date in dates }
return nearness[min(nearness.keys())]
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)
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.