web-dev-qa-db-ja.com

タイムデルタについて

以下の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 timeend timeの違いがわかります。5行目で、キャストによって期間を切り上げます。

デルタの意味(平均または差)は知っていますが、なぜseconds = uptimetimedeltaに渡す必要があり、なぜ文字列キャストがうまく機能してHH:MM:SSを取得するのですか?

83
Paul

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__の代わりにNice形式の値を返します。ドキュメントから:

str(t)文字列を[D day [s]、] [H] H:MM:SS [.UUUUUUU]の形式で返します。ここで、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

110
utdemir

なぜ秒=稼働時間をtimedeltaに渡す必要があるのですか

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

そして、なぜ文字列キャストが非常にうまく機能するので、HH:MM:SSを取得しますか?

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

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