Encuentra el objeto de fecha y hora más antiguo / más joven en una lista

93

Tengo una lista de objetos de fecha y hora y quiero encontrar el más antiguo o el más joven. Algunas de estas fechas podrían ser en el futuro.

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
]

¿Cuál es la forma más óptima de hacerlo? Estaba pensando en comparar datetime.now () con cada uno de esos.

panosl
fuente
6
¿Qué tal maxy min?
JoshD
9
No había ninguna pregunta similar en stackoverflow, busqué una respuesta, así que estoy seguro de que será útil para otros.
panosl

Respuestas:

129

Más antiguo:

oldest = min(datetimes)

Más joven antes de ahora:

now = datetime.datetime.now(pytz.utc)
youngest = max(dt for dt in datetimes if dt < now)
eumiro
fuente
¿Te refieres al mayor? ( Oldest before now)
Bulgantamir
En Python 3, creo que esto es defectuoso. Si doy esta matriz ["April2020", "March2020"], min me dará "April2020" como si min diera el más reciente. Sin embargo, si le doy ["April2020", "January2021", "March2020"], min me dará "April2020". Estoy bastante seguro de que min dará el orden alfabético más bajo, que no es necesariamente la fecha más reciente.
ScottyBlades
1
@ScottyBlades eso se debe a que en su ejemplo sus valores son cadenas (que representan una fecha, pero en realidad no son datevalores), por lo que solo se pueden comparar alfabéticamente. Si, en cambio, tuviera una matriz de valores dateo datetime, se compararían correctamente.
Jordan
30

Dada una lista de fechas dates:

La fecha máxima es max(dates)

La fecha mínima es min(dates)

JoshD
fuente
15

Las fechas y horas son comparables; para que puedas usar max(datetimes_list)ymin(datetimes_list)

Gabi Purcaru
fuente
6

has probado esto:

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