Python の timedelta で時間の差分を秒・分・時間に変換する

2つの datetime を引き算すると timedelta が得られます。この timedelta から「何秒差か」「何分差か」を取り出す方法を解説します。

timedelta の内部構造

timedelta は内部的に3つの属性だけで時間の長さを保持しています。

days日数(整数)
seconds秒数(0〜86399)
microsecondsマイクロ秒(0〜999999)

たとえば「1日と2時間30分」という timedelta は、days=1seconds=9000(2時間30分 = 9000秒)として格納されます。hoursminutes という属性は存在しないため、自分で計算する必要があるのです。

総秒数を取得する

total_seconds() メソッドを使うと、timedelta 全体を秒数に換算した値が得られます。

from datetime import datetime

start = datetime(2025, 1, 1, 10, 0, 0)
end = datetime(2025, 1, 1, 12, 30, 0)

delta = end - start
print(f"差分: {delta}")
print(f"総秒数: {delta.total_seconds()}")

出力は 9000.0 となります。2時間30分 = 150分 = 9000秒 ですね。この total_seconds() を起点に、分や時間への変換を行います。

分に変換する

総秒数を60で割れば分になります。

from datetime import datetime

start = datetime(2025, 1, 1, 10, 0, 0)
end = datetime(2025, 1, 1, 12, 30, 0)

delta = end - start
total_minutes = delta.total_seconds() / 60

print(f"総分数: {total_minutes}")  # 150.0

整数が欲しい場合は int() で変換するか、// 演算子で切り捨て除算を行います。

時間に変換する

総秒数を3600で割れば時間になります。

from datetime import datetime

start = datetime(2025, 1, 1, 10, 0, 0)
end = datetime(2025, 1, 3, 14, 30, 0)

delta = end - start
total_hours = delta.total_seconds() / 3600

print(f"差分: {delta}")
print(f"総時間: {total_hours}")  # 52.5

2日と4時間30分の差なので、48 + 4.5 = 52.5時間という結果になります。

時・分・秒に分解する

「○時間○分○秒」という形式で表示したい場合は、商と余りを使って分解します。

from datetime import datetime

start = datetime(2025, 1, 1, 10, 0, 0)
end = datetime(2025, 1, 1, 12, 34, 56)

delta = end - start
total_seconds = int(delta.total_seconds())

hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
seconds = total_seconds % 60

print(f"{hours}時間{minutes}{seconds}")  # 2時間34分56秒

divmod() を使うともう少し簡潔に書けます。

from datetime import datetime

start = datetime(2025, 1, 1, 10, 0, 0)
end = datetime(2025, 1, 1, 12, 34, 56)

delta = end - start
total_seconds = int(delta.total_seconds())

hours, remainder = divmod(total_seconds, 3600)
minutes, seconds = divmod(remainder, 60)

print(f"{hours}時間{minutes}{seconds}")

経過時間の表示や作業時間の集計など、実務でよく使うパターンなので覚えておくと便利です。