2015-08-26 20 views
16

Ho un array di oggetti datetime, e mi piacerebbe trovare quale elemento della matrice è più vicino a una certa data (per esempio datetime.datetime(2014,12,16))Trova la data più vicina a una certa data

This post mostra come trova la data più vicina che non è anteriore alla data indicata. Come posso modificare questo codice in modo che possa restituire le date precedenti a una determinata data?

Ad esempio, se la matrice contiene gli elementi datetime.datetime(2014,12,10) e datetime.datetime(2014,12,28), la voce precedente deve essere restituita perché è la più vicina a datetime.datetime(2014,12,16) in valore assoluto.

+0

Forse potresti provare a ordinare le date, controllare l'indice prima e dopo la data che stai guardando e vedere quale è più vicino ad esso? – Zarwan

+0

Al momento, utilizzo 'np.argwhere' per trovare tutti gli elementi prima e dopo la data specificata e prendere rispettivamente l'ultimo dei primi elementi. Il problema è che a volte non ci sono date dopo il 16 dicembre 2014 nell'array, che è un problema nel mio script. Sarebbe molto più facile trovare la data più vicina. – user3600497

+0

È possibile considerare l'utilizzo di [truncate] (http://stackoverflow.com/questions/9877391/how-to-get-the-closest-single-row-after-a-specific-datetime-index-using-python-p) funzione. –

risposta

34

Questa funzione restituisce la datetime in items che è la più vicina alla data pivot.

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

La buona parte questa funzione su altri tipi di datetime troppo fuori dalla scatola, se il tipo supporta confronto, sottrazione e abs, ad es .: i numeri e tipi di vettore.

+1

La semplicità è la migliore. Grande. –

+0

Wow, pulito! Forse è una specie di ciò che il mio metodo bigram cerca di riprodurre, ma molto più breve. –

+0

Semplicemente elegante! – artDeco

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

Come risposta sul collegamento this link, la funzione 'truncate' è lì per te.

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

Oppure si può utilizzare get_loc con l'opzione 'vicina'.

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

trovare una data più vicina e riportare il timedelta (differenza tra due date) ho fatto la seguente:

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

Questo può essere utile quando si dispone di una soglia minima per la vicinanza per la vostra app come ho fatto io.

+0

Grazie a @TamasHegedus –

Problemi correlati