Znajdź na liście najstarszy / najmłodszy obiekt daty i godziny


93

Mam listę obiektów daty i godziny i chcę znaleźć najstarszy lub najmłodszy. Niektóre z tych dat mogą przypadać w przyszłości.

from datetime import datetime

datetime_list = [
    datetime(2009, 10, 12, 10, 10),
    datetime(2010, 10, 12, 10, 10),
    datetime(2010, 10, 12, 10, 10),
    datetime(2011, 10, 12, 10, 10), #future
    datetime(2012, 10, 12, 10, 10), #future
]

Jaki jest najbardziej optymalny sposób, aby to zrobić? Myślałem o porównaniu datetime.now () z każdym z nich.


6
A co powiesz na maxi min?
JoshD

9
Nie było podobnego pytania na stackoverflow, przeszukałem odpowiedź, więc jestem pewien, że przyda się innym.
panosl

Odpowiedzi:


129

Najstarsze:

oldest = min(datetimes)

Najmłodszy wcześniej:

now = datetime.datetime.now(pytz.utc)
youngest = max(dt for dt in datetimes if dt < now)

Masz na myśli najstarszy? ( Oldest before now)
Bulgantamir

Myślę, że w Pythonie 3 jest to błąd. Jeśli podam tę tablicę [„kwiecień2020”, „marzec2020”], min da mi „kwiecień2020”, tak jakby min podało najnowsze. Jeśli jednak podam [„kwiecień 2020”, „styczeń 2021”, „marzec 2020”], to min da mi „kwiecień 2020”. Jestem prawie pewien, że min poda najniższą alfabetyczną datę, która niekoniecznie jest najnowszą datą.
ScottyBlades

1
@ScottyBlades to dlatego, że w twoim przykładzie twoje wartości są ciągami (które zdarzają się reprezentować datę, ale w rzeczywistości nie są datewartościami), więc można je naprawdę porównać tylko alfabetycznie. Gdybyś zamiast tego miał tablicę wartości datelub datetime, zostałyby one poprawnie porównane.
Jordan

30

Biorąc pod uwagę listę dat dates:

Maksymalna data to max(dates)

Minimalna data to min(dates)


15

Czasy danych są porównywalne; więc możesz użyć max(datetimes_list)imin(datetimes_list)


6

próbowałeś tego:

>>> from datetime import datetime as DT
>>> l =[]
>>> l.append(DT(1988,12,12))
>>> l.append(DT(1979,12,12))
>>> l.append(DT(1979,12,11))
>>> l.append(DT(2011,12,11))
>>> l.append(DT(2022,12,11))
>>> min(l)
datetime.datetime(1979, 12, 11, 0, 0)
>>> max(l)
datetime.datetime(2022, 12, 11, 0, 0)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.