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.

panosl
fonte
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)
eumiro
fonte
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)

JoshD
fonte
15

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

Gabi Purcaru
fonte
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)
Jknair
fonte
1

O módulo datetime tem suas próprias versões de min e max como métodos disponíveis. https://docs.python.org/2/library/datetime.html

Malik A. Rumi
fonte
De acordo com esses documentos, datetime.min () retorna o menor datetime representável, não o mínimo de uma lista de datetimes.
Daan