如何将表示时间范围的字符串转换为struct_time对象?

时间:2016-01-17 14:22:48

标签: python parsing datetime strptime

您可以使用strptime方法在Python中解析表示时间的字符串。 stackoverflow上有很多工作示例:

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 PM,而不是开始 - 结束时间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”)

1 个答案:

答案 0 :(得分:2)

strptime() 只能解析单个日期时间字符串表示

您必须按-拆分输入字符串,并使用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)]

还检查了受欢迎的第三方:dateutildeloreanarrow - 不要认为它们提供了日期时间范围解析功能。 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

这可能意味着它不应该解析多个日期时间。