9

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を実際に計算するには怠惰なので、これは妥当な妥協案のようです;-)。

4

2 に答える 2

12

Pythonの浮動小数点数は約15桁の有効数字であるため、秒は最大86400(小数点の左側5桁)、マイクロ秒は6桁であるため、日数(最大数年分)を失うことなく含めることができます。精度。

良いマントラは「円周率はナノセンチュリーです」です。100年あたり約3.14E9秒、つまり1年あたり3E7なので、1年あたり3E13マイクロ秒です。マントラは記憶に残るので良いですが、後で少し暗算する必要があります(しかし、ほうれん草のように、それはあなたにとって良いことです-あなたを敏捷で警戒し続けます!-)。

の設計哲学datetimeはややミニマリストであるため、単純な算術式に要約される多くの可能なヘルパーメソッドが省略されているのは当然のことです。

于 2009-07-05T03:35:44.367 に答える
3

精度に対するあなたの懸念は見当違いです。以下は、IEEE754 64 ビット浮動小数点数の 53 ビット精度の残りに何年を絞り込むことができるかを大まかに計算するための単純な 2 行です。

>>> 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
于 2009-07-05T07:17:38.173 に答える