Как сравнить несколько дат в списке на Python?

#python #list #web-scraping #beautifulsoup

#python #Список #очистка веб-страниц #beautifulsoup

Вопрос:

Мне интересно, как я могу сравнивать даты в списке. Я хотел бы извлечь «самую раннюю» дату. (Я выполнил цикл 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’

Комментарии:

1. Я набираю это на своем телефоне, поэтому не могу это протестировать, но должно быть что-то вроде ‘D.sort()[0]’ для сортировки и получения первого элемента. Или еще проще, просто используйте max или min

2. Кстати, ваш цикл кажется совершенно бессмысленным. Вы извлекаете целочисленные части из строки, затем создаете новую дату, затем игнорируете это и создаете другую новую дату, которую вы немедленно возвращаете в ту же строку, из которой она была проанализирована.

3. Если даты представляют собой строки в YYYY-MM-DD формате, просто min(comment_list) должно сработать.

Ответ №1:

Просто используйте функцию 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
  

Ответ №2:

 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() встроенную функцию для определения самой ранней даты

Ответ №3:

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

Ответ №4:

Как предложил Siong, вы можете использовать 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')
  

Ответ №5:

Если вы уверены, что все даты правильно дополнены нулями (т.Е. 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.

Ответ №6:

 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'