[英]Missing datetime.timedelta.to_seconds() -> float in Python?
据我所知,由于效率原因,秒和微秒可能在datetime.timedelta
单独表示,但我刚写了这个简单的函数:
def to_seconds_float(timedelta):
"""Calculate floating point representation of combined
seconds/microseconds attributes in :param:`timedelta`.
:raise ValueError: If :param:`timedelta.days` is truthy.
>>> to_seconds_float(datetime.timedelta(seconds=1, milliseconds=500))
1.5
>>> too_big = datetime.timedelta(days=1, seconds=12)
>>> to_seconds_float(too_big) # doctest: +ELLIPSIS
Traceback (most recent call last):
...
ValueError: ('Must not have days', datetime.timedelta(1, 12))
"""
if timedelta.days:
raise ValueError('Must not have days', timedelta)
return timedelta.seconds + timedelta.microseconds / 1E6
这对于像传值有用time.sleep
或select.select
。 为什么不是像datetime.timedelta
接口的这一部分? 我可能会错过一些角落案例。 时间表示似乎有这么多非明显的角落案例......
我拒绝了几天准确地进行了一次合理的拍摄(我太懒了,实际上算不上数学ATM,所以这似乎是一个合理的妥协;-)。
Python float有大约15位有效数字,所以秒数高达86400(小数点左边5位数)和微秒需要6位数,你可以很好地包括几天(最多几年的价值)而不会丢失精确。
一个很好的口头禅是“pi秒是一个nanocentury” - 每100年大约3.14E9秒,即每年3E7,所以每年3E13微秒。 口头禅是好的,因为它令人难忘,即使它确实需要你之后做一点心算(但是,像菠菜一样,它对你来说很好 - 让你保持敏捷和警觉! - )。
datetime
的设计理念有点极简主义,所以它省略了许多可能的辅助方法,这些方法归结为简单的算术表达式也就不足为奇了。
您对精度的关注是错误的。 这是一个简单的双线程,用于计算大约可以在IEEE754 64位浮点数中压缩53位预分值的数量:
>>> import math
>>> 10 ** (math.log10(2 ** 53) - math.log10(60 * 60 * 24) - 6) / 365.25
285.42092094268787
>>>
注意四舍五入; 首先添加最小的非零数字:
return timedelta.seconds + timedelta.microseconds / 1E6 + timedelta.days * 86400
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.