2016-01-17 6 views
3

Вы можете проанализировать строку, представляющую время, в Python, с помощью метода strptime. Есть множество рабочих примеров на StackOverflow:Как преобразовать строку, представляющую временной диапазон, в объект struct_time?

Converting string into datetime

Однако, что если ваша строка представляет собой время диапазона, в отличие от определенного времени; как вы могли разобрать строку, используя метод strptime?

Например, допустим, что пользователь вводит начало и время окончания.

studyTime = input("Please enter your study period (start time – finish time)") 

Вы можете запросить или даже заставить пользователя ввести время в определенном формате.

studyTime = input("Please enter your study period (hh:mm - hh:mm): ") 

Предположим, пользователь вводит 03:00 PM – 05:00 PM. Как мы можем разобрать эту строку, используя strptime?

formatTime = datetime.datetime.strptime(studyTime, "%I:%M %p") 

выше formatTime будет работать только на один раз, т.е. 03:00 П.М., не начала - время окончания, 03:00 - 05:00. И следующее будет означать избыточные данные формата, и будет поднят ValueError.

formatTime = datetime.datetime.strptime(studyTime, “%I:%M %p - %I:%M %p”) 

Конечно, есть альтернативы, такие как время начала и окончания как отдельные строки. Тем не менее, мой вопрос в частности, есть ли средство для синтаксического анализа одной строки, которая содержит более одного временного представления, используя что-то похожее на нижеследующее.

formatTime = datetime.datetime.strptime(studyTime, “%I:%M %p - %I:%M %p”) 

ответ

2

strptime()можно только разобрать одного типа DateTime строковое представление.

Вы должны разделить входную строку на - и загрузить каждый элемент с strptime():

>>> from datetime import datetime 
>>> 
>>> s = "03:00 PM - 05:00 PM" 
>>> [datetime.strptime(item, "%I:%M %p") for item in s.split(" - ")] 
[datetime.datetime(1900, 1, 1, 15, 0), datetime.datetime(1900, 1, 1, 17, 0)] 

проверены также популярные посторонних лиц: dateutil, delorean и arrow - не думаю, что они обеспечивают функциональность синтаксического анализа диапазона datetime. Dateutil-х fuzzy_with_tokens() выглядел многообещающим, но бросает ошибку:

>>> from dateutil.parser import parse 
>>> s = "03:00 PM - 05:00 PM" 
>>> parse(s, fuzzy_with_tokens=True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/dateutil/parser.py", line 1008, in parse 
    return DEFAULTPARSER.parse(timestr, **kwargs) 
    File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/dateutil/parser.py", line 390, in parse 
    res, skipped_tokens = self._parse(timestr, **kwargs) 
TypeError: 'NoneType' object is not iterable 

, который, вероятно, означает, что он не должен разобрать несколько DateTimes тоже.

+0

Спасибо alecxe, я догадался, что это будет так. Однако, поскольку я новичок в Python и вообще программировании, мне было любопытно узнать о возможных альтернативных способах решения этой проблемы. Я полагаю, что всегда мог написать свою собственную функцию, которая обеспечивает функциональность разбора 'datetime' * range *! –

+0

@ мугман да. Определенно сделайте это. Кроме того, вы можете проверить, что формат - это то, что вы ожидаете увидеть. Например, вы можете применить проверку регулярного выражения с помощью этого шаблона: 'pattern = re.compile (r" \ d {2}: \ d {2} - \ d {2}: \ d {2} ")' и затем разделите строку на тире и загрузите с помощью 'strptime' обработку исключений. Просто мысли. – alecxe

 Смежные вопросы

  • Нет связанных вопросов^_^