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.