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.

panosl
źródło
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)
eumiro
źródło
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)

JoshD
źródło
15

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

Gabi Purcaru
źródło
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)
jknair
źródło