Pythonで「100日後の日付」や「3時間前の時刻」などを計算する場合、標準ライブラリ datetime モジュールの timedelta クラスを使用します。
date 型や datetime 型のオブジェクトに対して timedelta を足し引きすることで、カレンダー(うるう年や月末の処理など)を自動的に考慮した正確な計算が可能です。
目次
1. 日時の加算(未来の日時を求める)
timedelta オブジェクトを作成し、元の日時オブジェクトに + 演算子で加算します。
ソースコード
from datetime import datetime, date, timedelta
# 基準となる日付と日時
base_date = date(2024, 12, 22)
base_datetime = datetime(2024, 12, 22, 12, 0, 30)
# 加算したい期間(100日)を定義
# timedeltaには days, seconds, microseconds, milliseconds, minutes, hours, weeks が指定可能
delta = timedelta(days=100)
# 計算の実行
future_date = base_date + delta
future_datetime = base_datetime + delta
print(f"基準日 : {base_date}")
print(f"100日後の日付: {future_date}")
print("-" * 30)
print(f"基準日時 : {base_datetime}")
print(f"100日後の日時: {future_datetime}")
実行結果
基準日 : 2024-12-22
100日後の日付: 2025-04-01
------------------------------
基準日時 : 2024-12-22 12:00:30
100日後の日時: 2025-04-01 12:00:30
※自動的に年が明け、月も正しく計算されています。
2. 日時の減算(過去の日時・差分の計算)
- 演算子を使うことで、「N日前」の計算や、2つの日時の「差(期間)」を求めることができます。
実装例:経過日数の計算
from datetime import datetime
# 過去の日時
start_time = datetime(2024, 1, 1, 9, 0, 0)
# 現在の日時(例として固定値を使用)
end_time = datetime(2025, 12, 22, 18, 30, 0)
# 日時同士を引き算すると、結果は timedelta オブジェクトになります
elapsed_time = end_time - start_time
print(f"開始: {start_time}")
print(f"終了: {end_time}")
print("-" * 30)
print(f"経過期間: {elapsed_time}")
print(f"総日数 : {elapsed_time.days} 日")
print(f"総秒数 : {elapsed_time.total_seconds()} 秒")
実行結果
開始: 2024-01-01 09:00:00
終了: 2025-12-22 18:30:00
------------------------------
経過期間: 721 days, 9:30:00
総日数 : 721 日
総秒数 : 62328600.0 秒
解説
timedeltaの主な引数
timedelta コンストラクタには以下の引数を指定できます(全て省略可能、デフォルトは0)。これらを組み合わせて柔軟な期間を表現できます。
days(日)hours(時間)minutes(分)seconds(秒)weeks(週間)- ※注意:
yearsやmonthsは引数に存在しません。月や年単位の計算が必要な場合は、dateutil.relativedeltaという外部ライブラリを使うのが一般的です。
- ※注意:
