几分之一秒和pytz:你有更清洁的解决方案吗?

时间:2015-09-14 23:30:01

标签: python python-3.x pytz

我在日志中的时间看起来像这样:

1440498131.372625

我使用pytz做的是

utc = pytz.utc
for anra in raFromMCCS:
    fsecs = float(anra.time)
    isecs = int(fsecs)
    isec2 = int(fsecs * 1000)
    dt = datetime.utcfromtimestamp(isecs).replace(tzinfo=utc)
    #print (dt.year)
    dt2 = utc.localize(datetime(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, int((fsecs - isecs) * 1000000)))
    #      dt3 = datetime.utcfromtimestamp(isec2)
    print(dt, dt2)#, dt3)  

我在愚蠢的dt3中试图表明我对这里的各种事情都很陌生。

我知道dt2给了我想要的东西,但它似乎是一种迂回的方式来到达那里。如果您有更好的解决方案,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将浮动直接传递给fromtimestamp()

d = datetime.fromtimestamp(1440498131.372625, utc)

如果您知道输入是POSIX时间(非“正确”时区),那么您可以使用直接公式:

d = datetime(1970, 1, 1, tzinfo=utc) + timedelta(seconds=1440498131.372625)

它应该为输入时间戳提供便携(更宽)的范围。 Python版本之间的舍入行为应该更加一致,请参阅datetime.utcfromtimestamp rounds results incorrectly

如果输入是字符串;您可以使用strptime('%f')解析微秒:

from datetime import datetime, timedelta

seconds, dot, us = "1440498131.372625".partition('.')
d = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=int(seconds))
if dot:
    d = d.replace(microsecond=datetime.strptime(us, '%f').microsecond)

其中timezone.utc is defined here。如果使用少于6位的数字表示微秒,例如".372"

,它也可以工作

只有最后一个代码示例才能保证为任何输入时间戳保留微秒。