我有一个整数秒的日期时间对象(例如: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'
我该如何解决这个问题?
答案 0 :(得分: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')
答案 1 :(得分: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')
答案 2 :(得分: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')
查看小数秒如何像{regexp一样{ - 1}} - 意味着它是可选的(如果没有,它会添加%符号)。
PS,您可以通过属性访问日期时间。如果你想丢弃tzinfo(默认情况下取自语言环境 - 我住在智利,因此上面是(.f)?
)来获得一个天真的日期时间:
America/Santiago