2009-07-05 76 views
9

據我所知,秒和毫秒都可能在datetime.timedelta出於效率的考慮單獨爲代表,但我只是寫了這個簡單的功能:Missing datetime.timedelta.to_seconds() - > float在Python中?

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.sleepselect.select有用。 爲什麼不像datetime.timedelta界面的這一部分?我可能會缺少一些角落案例。時間表示似乎有這麼多非顯而易見的角落案例...

我拒絕了幾天,以一定的精度有一個合理的拍攝(我懶得真的算出數學自動取款機,所以這似乎是一個合理的妥協;-)。

+0

問題是什麼? – 2009-07-05 11:57:10

+0

增強了它的實力 - 想知道是否有一個原因,它不包含在界面中。 – cdleary 2009-07-05 22:47:14

+2

這看起來是一個https://stackoverflow.com/questions/21414639/convert-timedelta-to-floating-point它有一個更好的答案。 – outofculture 2014-03-12 23:53:25

回答

12

Python浮點數大約有15位有效數字,所以秒數達到86400(小數點左邊的5位數字)和需要6位數的微秒數,可以包含日期(最長可達數年)而不會損失精度。

一個很好的口頭禪是「pi秒是納米級的」 - 每100年約3.14E9秒,即每年3E7,所以每年3E13微秒。口頭禪是好的,因爲它是令人難忘的,即使它確實需要你稍後做一點心算(但是,像菠菜一樣,它對你很好 - 保持你的敏捷和警覺!)。

datetime的設計理念有點簡約,所以毫不奇怪它省略了許多可能的簡化算術表達式的幫助器方法。

3

您對精度的擔心是錯位的。這裏有一個簡單的兩班輪來計算大致可以多少年擠入還剩下些什麼precsion的在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