Python 3 datetime.fromtimestamp失败1微秒
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python 3 datetime.fromtimestamp失败1微秒,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1567字,纯文字阅读大概需要3分钟。
内容图文
![Python 3 datetime.fromtimestamp失败1微秒](/upload/InfoBanner/zyjiaocheng/794/9db65cc8b5a4454ab0a2d745a04273bc.jpg)
我想以微秒分辨率保存日期时间作为时间戳.但似乎Python 3 datetime模块在加载它们时会丢失一微秒.为了测试这个,我们创建一个脚本:
test_datetime.py:
from random import randint
from datetime import datetime
now = datetime.now()
for n in range(1000):
d = datetime(year=now.year, month=now.month, day=now.day,
hour=now.hour, minute=now.minute, second=now.second,
microsecond=randint(0,999999))
ts = d.timestamp()
d2 = datetime.fromtimestamp(ts)
assert d == d2, 'failed in pass {}: {} != {}'.format(n, d, d2)
python3 test_datetime.py总是失败1微秒:
Traceback (most recent call last):
File "test_datetime.py", line 14, in <module>
assert d == d2, 'failed in pass {}: {} != {}'.format(n, d, d2)
AssertionError: failed in pass 4: 2014-07-02 11:51:46.984716 != 2014-07-02 11:51:46.984715
这种行为是否被接受?如果我们想要微秒分辨率,我们不应该依赖datetime.fromtimestamp吗?
解决方法:
时间戳值是浮点值.浮点值是近似值,因此,舍入误差适用.
例如,浮点值1404313854.442585不精确.它确实是:
>>> dt = datetime(2014, 7, 2, 16, 10, 54, 442585)
>>> dt.timestamp()
1404313854.442585
>>> format(dt.timestamp(), '.20f')
'1404313854.44258499145507812500'
这非常接近442585,但并不完全.它刚好低于442585,所以当你只取小数部分时,乘以1百万,然后只取整数部分0.991455078125余数被忽略,最终得到442584.
因此,当您将浮点值转换回datetime对象时,1微秒的舍入错误是正常的.
如果您需要精度,请不要依赖浮子;或许将微秒值存储为单独的整数,然后使用dt.fromtimestamp(seconds).replace(microsecond = microseconds).
在这种情况下,您可能会发现rejection notice至PEP-410 (Use decimal.Decimal type for timestamps)的启发性. PEP触及精度问题,时间戳表示为浮点数.
内容总结
以上是互联网集市为您收集整理的Python 3 datetime.fromtimestamp失败1微秒全部内容,希望文章能够帮你解决Python 3 datetime.fromtimestamp失败1微秒所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。