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.


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)

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


15

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


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)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.