2015-08-26 12 views
16

Mam tablicę obiektów datetime, i chciałbym dowiedzieć się, jakie element w tablicy znajduje się najbliżej danego dnia (np datetime.datetime(2014,12,16))Znajdź najbliższy termin na dany dzień

This post pokazuje jak znajdź najbliższą datę , która nie jest wcześniejsza niż podana data. Jak mogę zmienić ten kod, aby mógł zwracać daty sprzed określonej daty?

Na przykład, jeśli tablica mieści elementy datetime.datetime(2014,12,10) i datetime.datetime(2014,12,28), poprzedni element powinien zostać zwrócony, ponieważ jest najbliższy datetime.datetime(2014,12,16) w wartości bezwzględnej.

+0

Może możesz spróbować posortować daty, a następnie sprawdzić indeks przed i po dacie, na którą patrzysz i zobaczyć, który z nich jest bliżej? – Zarwan

+0

W tej chwili używam 'np.argwhere', aby znaleźć wszystkie elementy przed i po podanej dacie i wziąć odpowiednio pierwsze z pierwszych elementów. Problem polega na tym, że czasami nie ma dat po 16 grudnia 2014 r. W tablicy, co jest problemem w moim skrypcie. O wiele łatwiej byłoby znaleźć najbliższą datę. – user3600497

+0

Możesz rozważyć użycie funkcji [truncate] (http://stackoverflow.com/questions/9877391/how-to-get-the-closest-single-row-afcera-a-specific-datetime-index-using-python-p). –

Odpowiedz

34

Ta funkcja zwróci datetime w items który znajduje się najbliżej daty pivot.

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

Dobrą część funkcja ta działa na innych typów niż datetime zbyt wyjęciu z pudełka, jeśli typ obsługuje porównania, odejmowanie i abs, np .: liczby i rodzajów wektorowej.

+1

Prostota w najlepszym wydaniu. Wspaniały. –

+0

Wow, schludny! Może to jest coś, co moja metoda bigram stara się rozmnażać, ale znacznie krótsza. –

+0

Po prostu elegancko! – artDeco

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

Jak odpowiedziałeś na link this link, funkcja "obcięcie" jest dostępna dla ciebie.

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

Albo można użyć get_loc z 'najbliższego' opcja.

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

Aby znaleźć najbliższy termin i zwrócić timedelta (różnicę pomiędzy dwoma datami) Zrobiłem następujące:

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

ta może być przydatna, gdy masz próg minimalny bliskości ci? aplikacja tak jak ja.

+0

Dzięki @TamasHegedus –