2

我有一个整数秒的日期时间对象(例如:)2010-04-16 16:51:23。我正在使用以下命令来提取确切的时间

dt = datetime.datetime.strptime(time, '%Y-%m-%d %H:%M:%S.%f

(通常,我有小数(例如:),2010-04-16 16:51:23.1456但有时我没有。所以当我运行这个命令时,我收到一条错误消息

ValueError: time data '2010-04-16 16:51:23' does not match format '%Y-%m-%d %H:%M:%S.%f'

我该如何解决这个问题?

4

3 回答 3

4

这是因为您没有指定的格式。你有以下格式:

'%Y-%m-%d %H:%M:%S'

有多种解决方案。首先,始终以相同的格式生成数据(.00如果需要,可以添加)。

第二种解决方案是您try以一种格式解码,如果失败,则使用另一种格式解码:

try:
    dt = datetime.datetime.strptime(time, '%Y-%m-%d %H:%M:%S.%f')
except ValueError:
    dt = datetime.datetime.strptime(time, '%Y-%m-%d %H:%M:%S')
于 2013-06-24T20:57:34.930 回答
0

避免使用异常处理机制的另一种方法是默认字段(如果不存在)并尝试使用一个格式字符串进行处理:

from datetime import datetime

s = '2010-04-16 16:51:23.123'
dt, secs = s.partition('.')[::2]
print datetime.strptime('{}.{}'.format(dt, secs or '0'), '%Y-%m-%d %H:%M:%S.%f')
于 2013-06-24T21:01:33.157 回答
0

如果你使用最新的 python (3.2+) simple-date会为你做这样的事情:

>>> from simpledate import *
>>> SimpleDate('2010-04-16 16:51:23.1456')
SimpleDate('2010-04-16 16:51:23.145600', tz='America/Santiago')
>>> SimpleDate('2010-04-16 16:51:23')
SimpleDate('2010-04-16 16:51:23', tz='America/Santiago')

它通过扩展 python 模板格式来工作。所以你也可以写(不需要,因为默认处理类似 ISO8601 的格式):

>>> SimpleDate('2010-04-16 16:51:23', format='Y-m-d H:M:S(.f)?')
SimpleDate('2010-04-16 16:51:23', tz='America/Santiago')

看看小数秒是如何(.f)?像一个正则表达式 - 意味着它是可选的(另外,如果没有,它将添加 % 符号)。

PS,您可以通过属性访问日期时间。如果您想丢弃 tzinfo (默认情况下取自语言环境 - 我住在智利,因此America/Santiago在上面)以获得天真的日期时间:

>>> SimpleDate('2010-04-16 16:51:23').naive.datetime
datetime.datetime(2010, 4, 16, 16, 51, 23)
于 2013-06-24T23:04:28.093 回答