从字符串到日期时间,有或没有毫秒

时间:2015-10-15 12:33:26

标签: python datetime strptime

我有一个字符串列表,每个字符串代表一个有或没有毫秒的时间,例如

l = ['03:18:45.2345', '03:19:23']  我想将每个字符串转换为日期时间对象。现在我正在跑步:

>>> l = ['03:18:45.2345', '03:19:23']
>>> for item in l:
...     print datetime.datetime.strptime(item, "%H:%M:%S.%f")
... 
1900-01-01 03:18:45.234500
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '03:19:23' does not match format '%H:%M:%S.%f'

因此,问题是:如何迭代转换datetime对象中每个元素的列表?

首先想到的是try..except..

try:
    print datetime.datetime.strptime(item, "%H:%M:%S.%f")
except:
    print datetime.datetime.strptime(item, "%H:%M:%S")

如果没有抓住ValueError,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

l = ['03:18:45.2345', '03:19:23']
for item in l:
    time_format = "%H:%M:%S.%f" if '.' in item else "%H:%M:%S"
    print datetime.datetime.strptime(item, time_format)

答案 1 :(得分:1)

如果处理更复杂的情况(日期字符串更复杂)。我建议您使用dateutil代替datetime模块。

dateutil.parser提供了一个通用日期/时间字符串解析器,它能够解析大多数已知格式以表示日期和/或时间。

此功能的原型是:parse(timestr)(您不必自己指定格式)。

<强>样本

>>> parse("2003-09-25T10:49:41")
datetime.datetime(2003, 9, 25, 10, 49, 41)

>>> parse("2003-09-25T10:49")
datetime.datetime(2003, 9, 25, 10, 49)

模糊解析:

>>> s = "Today is 25 of September of 2003, exactly " \
...     "at 10:49:41 with timezone -03:00."
>>> parse(s, fuzzy=True)
datetime.datetime(2003, 9, 25, 10, 49, 41,
              tzinfo=tzoffset(None, -10800))

答案 2 :(得分:0)

ValueError方法很好但是如果你想在这里避免try/except

#!/usr/bin/env python
from datetime import datetime

for time_string in ['03:18:45.2345', '03:19:23']:
    time_string, dot, us = time_string.partition('.')
    d = datetime.strptime(time_string, '%H:%M:%S')
    if dot:
        d = d.replace(microsecond=datetime.strptime(us, '%f').microsecond)
    print(repr(d.time()))

输出

datetime.time(3, 18, 45, 234500)
datetime.time(3, 19, 23)