timedeltaを日、時間、分に変換する


242

タイムデルタがあります。私はそこから何日、何時間、何分も欲しいのです-タプルか辞書のどちらかとして...私は大騒ぎしていません。

私は何十年にもわたって数十の言語でこれを数十回行ったに違いありませんが、Pythonは通常すべてに対して単純な答えを持っているので、吐き気を誘うほど単純な(まだ冗長な)数学を無効にする前に、ここで質問したいと思いました。

フーズ氏は良い点を挙げている。

私は「リスト」(ebayリストのようなもの)を扱っていますが、それぞれに期間があります。残り時間を見つけようとしていますwhen_added + duration - now

私はそれがDSTの原因にならないと言って正しいのですか?そうでない場合、1時間を加算/減算する最も簡単な方法は何ですか?


それをHH:mm:ss形式の文字列として取得するだけの場合は、オブジェクト「datetime.timedelta(seconds = 1177)」から「0:19:37」と言います。単にstr()を使用しますtimedelta
Peter Mortensen

回答:


342

datetime.timedelta値がある場合はtdtd.daysすでに必要な「日」が与えられています。timedelta値は1日の端数を秒単位で保持します(直接の数時間や数分ではありません)。そのため、実際には「吐き気を誘うほど単純な数学」を実行する必要があります。例:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

1
場合ことを覚えておいてくださいtdマイナスである、-1 // 3600です-1
jcrs 2018年

4
なぜ // ?/の代わりに
Mohammed Shareef C

10
///浮動小数点数ではなく整数を取得する代わりに使用されます。//は床除算演算子です:「結果として、数値ラインの左に調整された整数になる除算」。ここを参照してください
Eerik Sven Puudist

1
@EerikSvenPuudist jcrs尖ったアウトは、-1//3600ある-1、なぜ使用しないint(td.seconds/3600)オンにする代わり-1に二0時間ではなく、1時間の後方?
simpleuser

残りの秒数も追加してみませんか? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60その後 seconds = x.seconds - hours*3600 - minutes*60
ラファエル

73

これは少しコンパクトで、時間、分、秒が2行で表示されます。

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

7
td.daysゼロ以外の場合は正しくありません。あなたが必要hours += td.days*24です。秒の端数を考慮したい場合(OPは考慮しません); seconds += td.microseconds / 1e6使用することができます。
jfs

30
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

DSTに関しては、両方のdatetimeオブジェクトを秒に変換するのが最善だと思います。このようにして、システムはDSTを計算します。

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1
mktime()ローカルタイムゾーンが異なる時間に異なるutcオフセットを持っている場合、失敗する可能性があります(多くの場合)。pytzモジュールを使用して、ポータブルな決定論的な方法でtzデータベースにアクセスできます。また、現地時間はあいまいである可能性があります(エラーの可能性は50%)。たとえば、ログファイルの日付が常に(常にではない)単調であるなど、明確にするためにいくつかの追加情報が必要です。参照してください。私はPythonの日からその日を引くことができますどのように?同様の問題に対処する必要があるかもしれません。
jfs

7

わかりません

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

これはどう

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

フロートとして分と秒を取得します。


0

私は以下を使用しました:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.