timedeltaについて


90

以下のpythonコードを考慮して、そこで何が起こっているのかを理解してください。

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

だから私は、違いを取得start timeし、end time、5行目で、私はキャストして時間を切り上げ、今、さらに説明が何を何ですか?

私はデルタが何を意味するか(平均または差)を知っていますが、なぜ渡さなければならないのですかseconds = uptimetimedeltaそしてなぜ文字列キャストは非常にうまく機能するのHH:MM:SSですか?

回答:


114

timedeltaは次のように定義されているためです。

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

すべての引数はオプションであり、デフォルトは0です。

このようにオプションの引数を使用すると、「3日と4ミリ秒」と簡単に言うことができます。

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

また、strキャストでは、__repr__読みやすさを向上させる代わりに、適切にフォーマットされた値を返します。ドキュメントから:

str(t)[D day [s]、] [H] H:MM:SS [.UUUUUU]の形式で文字列を返します。Dは負のtに対して負です。(5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

チェックアウトドキュメント:

http://docs.python.org/library/datetime.html#timedelta-objects


13

なぜ秒を渡す必要があるのですか

timedeltaオブジェクトには秒、ミリ秒、日などを渡すことができるため、何を渡すかを指定する必要があります(これが明示的なキーを使用する理由です)。intfloatを受け入れることもできるので、への型キャストは不必要です。

文字列のキャストがうまく機能してHH:MM:SSになるのはなぜですか?

フォーマットするのは型キャストではなく__str__、オブジェクトの内部メソッドです。実際、次のように記述しても同じ結果が得られます。

print datetime.timedelta(seconds=int(uptime))

1
あなたはこれをほのめかしますが、timedeltaはHH:MM:SS形式で表示することよりも多くのことを行うことに明確に注意する価値があります。timedeltaオブジェクトは、2つのdatetimeオブジェクトの差をとる必要がある場合に使用されます。
Wilduck '19

1
それは__repr__方法ではなく、__str__方法です。
utdemir 2011

1
ない__repr__()はtimedeltaのが、その__str__()方法。あなたをprint呼び__str()__ます。
bgporter '19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.