我需要将字符串转换为datetime对象,以及小数秒。我遇到了各种各样的问题。
通常,我会这样做:
>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")
但错误和旧文档告诉我python2.5的strptime没有%f ...
进一步调查,似乎App Engine的数据存储不喜欢小数秒。在编辑数据存储区实体时,尝试将.5添加到datetime字段会给出以下错误:
ValueError: unconverted data remains: .5
我怀疑不支持小数秒......所以这只是在数据存储区查看器上,对吗?
有没有人绕过这个问题?我想使用本机日期时间对象...我宁愿不存储UNIX时间戳......
谢谢!
要记住的一件事是在喂入之前检查nofrag的长度。不同的来源在几秒钟内使用不同的精度。
对于那些寻找类似内容的人来说,这是一个快速的功能:
def strptime(val):
if '.' not in val:
return datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S")
nofrag, frag = val.split(".")
date = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
frag = frag[:6] # truncate to microseconds
frag += (6 - len(frag)) * '0' # add 0s
return date.replace(microsecond=int(frag))
答案 0 :(得分:11)
<强>解析强>
如果没有%f
格式支持datetime.datetime.strptime()
,您仍然可以使用{{datetime.datetime
对象(在此处随机选择val
的值)轻松输入1}}),在2.5.5上测试:
datetime.datetime.replace()
现在你有>>> val = '2010-08-06T10:00:14.143896'
>>> nofrag, frag = val.split('.')
>>> nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
>>> dt = nofrag_dt.replace(microsecond=int(frag))
>>> dt
datetime.datetime(2010, 8, 6, 10, 0, 14, 143896)
个对象。
<强>存储强>
进一步阅读http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime
我可以看到没有提到不支持分数,所以是的,它可能只是数据存储区查看器。文档直接指向Python 2.5.2的datetime.datetime
模块文档,它支持分数,而不支持datetime
的{{1}}解析指令。然而,查询分数可能会更棘手......
答案 1 :(得分:3)
现在所有的古代历史,但在这些现代,你也可以方便地使用dateutil
from dateutil import parser as DUp
funky_time_str = "1/1/2011 12:51:00.0123 AM"
foo = DUp.parse(funky_time_str)
print foo.timetuple()
# time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=51, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)
print foo.microsecond
# 12300
print foo
# 2011-01-01 00:51:00.012300
dateutil
支持各种可能的输入格式,它在没有模式字符串的情况下解析。