带小数秒的字符串最新时间,在Google应用程序引擎上

2024-09-29 01:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将字符串和小数秒一起转换为datetime对象。我遇到了各种各样的问题。

通常,我会:

>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")

但是错误和旧文档告诉我python2.5的strtime没有%f。。。

进一步调查,似乎应用程序引擎的数据存储不喜欢分数秒。编辑数据存储实体时,尝试将.5添加到datetime字段时出现以下错误:

ValueError: unconverted data remains: .5

我怀疑分数秒不受支持。。。所以这只是在数据存储查看器上,对吧?

有人回避过这个问题吗?我想使用本机datetime对象。。。我宁愿不存储UNIX时间戳。。。

谢谢!


编辑:感谢雅各布·奥斯卡森给了我一个.替换(…)的提示!

要记住的一件事是在喂食诺夫拉之前检查它的长度。不同的源使用不同的秒精度。

这里有一个快速的功能,供那些寻找类似的东西:

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))

Tags: 数据对象字符串文档编辑datetimedatereturn
2条回答

分析

如果没有对datetime.datetime.strptime()%f格式支持,您仍然可以很容易地使用datetime.datetime.replace()将其输入到一个datetime.datetime对象(在这里为您的val随机选择一个值),在2.5.5上测试:

>>> 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)

现在有了datetime.datetime对象。

存储

深入阅读http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime

我看不出提到分数是不支持的,所以是的,它可能只是数据存储查看器。文档直接指向Python 2.5.2的datetime模块文档,并且它支持分数,而不是strptime%f解析指令。不过,查询分数可能更麻烦。。

所有古代的历史到现在为止,但是在这些现代你也可以方便地使用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支持各种可能的输入格式,它不需要模式字符串就可以解析这些格式。

相关问题 更多 >