Как выбрать переменные значения из списка для преобразования в datetime?

#python #list #datetime

#python #Список #datetime

Вопрос:

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

У меня есть список именованных result_list списков, в которых первый индекс строки — это отметка даты / времени, а второй индекс — количество комментариев. Меня попросили сделать следующее:

  • Извлеките час из даты, которая является первым элементом строки.
  • Используйте datetime.strptime() метод для анализа даты и создания объекта datetime.
 from datetime import datetime

# here is your list of values
result_list = ['8/16/2016 9:55', '6.0', '11/22/2015 13:43', '29.0']

# set the format
date_format = '%m/%d/%Y %H:%M'

for row in result_list:
    time = row[0]
    time_dt = datetime.strptime(time, date_format)
  

Ошибка

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-ecf5afb3f99e> in <module>
      9 for row in result_list:
     10     time = row[0]
---> 11     time_dt = datetime.strptime(time, date_format)

e:Anaconda3lib_strptime.py in _strptime_datetime(cls, data_string, format)
    566     """Return a class cls instance based on the input string and the
    567     format string."""
--> 568     tt, fraction, gmtoff_fraction = _strptime(data_string, format)
    569     tzname, gmtoff = tt[-2:]
    570     args = tt[:6]   (fraction,)

e:Anaconda3lib_strptime.py in _strptime(data_string, format)
    347     found = format_regex.match(data_string)
    348     if not found:
--> 349         raise ValueError("time data %r does not match format %r" %
    350                          (data_string, format))
    351     if len(data_string) != found.end():

ValueError: time data '8' does not match format '%m/%d/%Y %H:%M'
  

Я предполагаю, что получаю ошибку из datetime.strptime() -за того, что конструктор ожидает значение 08 вместо 8. Однако я не уверен, с чего начать решение этой проблемы.

Ответ №1:

  • result_list это плоский список, в нем нет групп, так row[0] 8 же как и значение со значением с индексом 0.
  • Как только значение даты будет правильно преобразовано в datetime, используйте различные методы, например .hour , для извлечения требуемого значения.
  • Один из вариантов — использовать понимание списка для группировки даты и связанного количества комментариев.
 from datetime import datetime

# here is your list of values
result_list = ['8/16/2016 9:55', '6.0', '11/22/2015 13:43', '29.0']

# set the format
date_format = '%m/%d/%Y %H:%M'

# group each date and count together
rl_updated1 = [result_list[k:k 2] for k in range(0, len(result_list), 2)]

print(rl_updated1)
[out]:
[['8/16/2016 9:55', '6.0'], ['11/22/2015 13:43', '29.0']]

# convert to a datetime format in a list comprehension
rl_updated2 = [[datetime.strptime(v[0], date_format), v[1]] for v in rl_updated1]

print(rl_updated2)
[out]:
[[datetime.datetime(2016, 8, 16, 9, 55), '6.0'],
 [datetime.datetime(2015, 11, 22, 13, 43), '29.0']]

# alternatively, iterate through rl_updated1, before converting to a date format
for group in rl_updated1:
    dt = group[0]
    dt = datetime.striptime(dt, date_format)
  
  • Сохраните плоский список и выберите даты из индексов, где i % 2 == 0
 for i, v in enumerate(result_list):
    if i%2 == 0:
        time_dt = datetime.strptime(v, date_format)
        print(time_dt)
    else:
        comment = v
        print(v)

[out]:
2016-08-16 09:55:00
6.0
2015-11-22 13:43:00
29.0