Как сравнить несколько дат в списке в Python? - PullRequest
1 голос
/ 15 марта 2019

Мне интересно, как я могу сравнивать даты в списке. Я хотел бы извлечь самую раннюю дату. (Я сделал цикл for, поскольку мне пришлось заменить некоторые символы на '-')

comment_list = comment_container.findAll("div", {"class" : "comment-date"})
D =[]

  for commentDate in comment_list:
    year, month, day = map(int, commentDate.split('-'))
    date_object = datetime(year, month, day)
    date_object = datetime.strptime(commentDate, '%Y-%m-%d').strftime('%Y-%m-%d')   
    D.append(date_object)

print(D)

Выход:

['2018-06-26', '2018-04-01', '2018-07-19', '2018-04-23', '2018-08-25', '2018-06-08', '2018-06-14', '2018-07-08', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15']

Я хочу извлечь самую раннюю дату:

Например.

'2018-04-01'

Ответы [ 6 ]

4 голосов
/ 15 марта 2019

Просто используйте функцию min:

A = ['2018-06-26', '2018-04-01', '2018-07-19', '2018-04-23', '2018-08-25', '2018-06-08', '2018-06-14', '2018-07-08', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15']
print(min(A))

производит

2018-04-01
1 голос
/ 15 марта 2019

Если вы уверены, что все даты заполнены нулями (т. Е. 01 для января, а не 1 и т. Д.), То достаточно просто min или max.Однако я хочу отметить, что tuple s из int s также могут быть отсортированы, что может быть полезно, если вы встретите смешанные и не дополненные даты, рассмотрим, например:

d = ['2018-7-1','2018-08-01']
print(min(d)) #prints 2018-08-01 i.e. later date
print(min(d,key=lambda x:tuple(int(i) for i in x.split('-')))) #prints 2018-7-1

Это решение предполагаетданные не повреждены, то есть все элементы, созданные с помощью .split('-'), могут быть преобразованы в int s.

1 голос
/ 15 марта 2019

Как предлагает Сионг, вы можете использовать min(D).Вы можете добиться того же, как это:

comment_list = comment_container.findAll("div", {"class" : "comment-date"})
D = [datetime.strptime(commentDate, '%Y-%m-%d') for commentDate in comment_list]

print(min(D))

Работа с datetime.datetime объектами обычно предпочтительнее, так как ваши сравнения не основаны на форматировании строки.Вы всегда можете преобразовать в строку позже:

min_date_str = min(D).strftime('%Y-%m-%d')
1 голос
/ 15 марта 2019
from datetime import datetime 

D = ['2018-06-26', '2018-04-01', '2018-07-19', '2018-04-23', '2018-08-25', '2018-06-08',
 '2018-06-14', '2018-07-08', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15', '2019-03-15']
D.sort()
print(D[0])

или это, если вы не хотите менять D

T = D[:]
T.sort()
print(T[0])
1 голос
/ 15 марта 2019
comment_list = comment_container.findAll("div", {"class" : "comment-date"})
D =[]

  for commentDate in comment_list:
    year, month, day = map(int, commentDate.split('-'))
    date_object = datetime(year, month, day)  
    D.append(date_object)

print(min(D))

Вы должны сохранить даты как объекты datetime, а затем использовать встроенную функцию min(), чтобы определить самую раннюю дату

0 голосов
/ 15 марта 2019
from dateutil.parser import parse

d = ['2018-7-1','2018-08-01']

date_mapping = dict((parse(x), x) for x in d)
earliest_date = date_mapping[min(date_mapping)]
print(earliest_date)

>>>> '2018-7-1'
...