Encontre o objeto datetime mais antigo / mais recente em uma lista


98

Eu tenho uma lista de objetos datetime e quero encontrar o mais antigo ou o mais novo. Algumas dessas datas podem ser no 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
]

Qual é a maneira mais ideal de fazer isso? Eu estava pensando em comparar datetime.now () a cada um deles.


6
Que tal maxe min?
JoshD

9
Não havia nenhuma pergunta semelhante no stackoverflow, eu pesquisei uma resposta, então tenho certeza que será útil para outros.
panosl

Respostas:


132

Mais antigo:

oldest = min(datetimes)

O mais jovem antes de agora:

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

Você quer dizer mais velho? ( Oldest before now)
Bulgantamir

No Python 3, acho que isso é errado. Se eu der essa matriz ["April2020", "March2020"], min me dará "April2020" como se min fosse o mais recente. No entanto, se eu der ["April2020", "January2021", "March2020"], min me dará "April2020". Tenho certeza de que min fornecerá a data alfabética mais baixa, que não é necessariamente a data mais recente.
ScottyBlades de

1
@ScottyBlades isso ocorre porque em seu exemplo seus valores são strings (que representam uma data, mas não são realmente datevalores), então eles só podem ser realmente comparados em ordem alfabética. Se, em vez disso, você tivesse uma matriz de valores dateou datetime, eles seriam comparados corretamente.
Jordan

30

Dada uma lista de datas dates:

Data máxima é max(dates)

Data mínima é min(dates)


15

Datetimes são comparáveis; então você pode usar max(datetimes_list)emin(datetimes_list)


6

você já tentou isso:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.