Trova l'oggetto datetime più vecchio / più giovane in un elenco


93

Ho un elenco di oggetti datetime e voglio trovare quello più vecchio o più giovane. Alcune di queste date potrebbero essere future.

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
]

Qual è il modo più ottimale per farlo? Stavo pensando di confrontare datetime.now () con ciascuno di questi.


6
Che ne dici di maxe min?
JoshD

9
Non c'erano domande simili su stackoverflow, ho cercato una risposta, quindi sono sicuro che sarà utile agli altri.
panosl

Risposte:


129

Il più vecchio:

oldest = min(datetimes)

I più giovani prima d'ora:

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

Intendi il più vecchio? ( Oldest before now)
Bulgantamir

In Python 3, penso che questo sia difettoso. Se fornisco questo array ["April2020", "March2020"], min mi darà "April2020" come se min fornisse il più recente. Tuttavia, se fornisco ["aprile2020", "gennaio2021", "marzo2020"], min mi darà "aprile2020". Sono abbastanza sicuro che min fornirà la più bassa alfabetica che non è necessariamente la data più recente.
ScottyBlades

1
@ScottyBlades questo perché nel tuo esempio i tuoi valori sono stringhe (che rappresentano una data, ma non sono effettivamente datevalori), quindi possono essere confrontati solo alfabeticamente. Se invece avessi un array di dateo datetimevalori, verrebbero confrontati correttamente.
Jordan

30

Dato un elenco di date dates:

La data massima è max(dates)

La data minima è min(dates)


15

I tempi sono comparabili; quindi puoi usare max(datetimes_list)emin(datetimes_list)


6

hai provato questo:

>>> 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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.