Python の timedelta で時間の差分を秒・分・時間に変換する
2つの datetime を引き算すると timedelta が得られます。この timedelta から「何秒差か」「何分差か」を取り出す方法を解説します。
timedelta の内部構造
timedelta は内部的に3つの属性だけで時間の長さを保持しています。
| days | 日数(整数) |
| seconds | 秒数(0〜86399) |
| microseconds | マイクロ秒(0〜999999) |
たとえば「1日と2時間30分」という timedelta は、days=1、seconds=9000(2時間30分 = 9000秒)として格納されます。hours や minutes という属性は存在しないため、自分で計算する必要があるのです。
総秒数を取得する
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}秒")
経過時間の表示や作業時間の集計など、実務でよく使うパターンなので覚えておくと便利です。