Pythonで日付の比較をする方法(datetimeオブジェクトの比較演算)
生徒
「今日と明日を比べてどちらが前か後かを判定したいです。Pythonで日付の比較ってどうやるんですか?」
先生
「Pythonではdatetimeモジュールのdateやdatetimeオブジェクトをそのまま比較できます。比較演算子を使えば直感的に書けますよ。」
生徒
「具体的なコードで見せてください。初心者でも分かるようにお願いします。」
先生
「では順番に、基本から注意点まで分かりやすく説明します。」
1. 基本:datetimeオブジェクト同士は直接比較できる
Pythonのdatetimeモジュールで作ったdateやdatetimeオブジェクトは、大小比較や等価比較(<、>、==など)が直接使えます。これは「年・月・日・時・分・秒」を内部で順番に比較しているためで、人がカレンダーで比較するのと同じ感覚で扱えます。
from datetime import date, datetime
d1 = date(2025, 1, 15)
d2 = date(2025, 1, 20)
print(d1 < d2) # True
print(d1 == d2) # False
dt1 = datetime(2025,1,15,10,0,0)
dt2 = datetime(2025,1,15,12,0,0)
print(dt1 < dt2) # True
2. date と datetime を比較する場合の注意
dateオブジェクトとdatetimeオブジェクトは直接比較できません。片方をもう片方の型に揃える必要があります。たとえばdatetimeを.date()で日付部分だけ取り出して比較するのが一般的です。
from datetime import date, datetime
d = date(2025,1,15)
dt = datetime(2025,1,15, 9, 0, 0)
# d < dt <-- これはエラーになる
print(d < dt.date()) # False(同じ日付)
3. 範囲チェック(ある期間内かどうか)
開始日と終了日の間にあるかを判定したいときは、比較演算子を組み合わせます。start <= target <= end のように書くと読みやすく、カレンダー範囲のチェックや予約システムでよく使います。
from datetime import date
start = date(2025,1,1)
end = date(2025,1,31)
target = date(2025,1,15)
if start <= target <= end:
print("対象日は範囲内です")
4. 期間の差を計算して比較する(timedelta)
二つの日付の差を求めると、timedeltaオブジェクトが返ります。差の.daysを使えば日数で比較できます。たとえば締め切りまであと何日かを計算する用途に便利です。
from datetime import date
today = date.today()
deadline = date(2025,2,1)
remaining = (deadline - today).days
print(f"締め切りまであと{remaining}日")
5. タイムゾーン付き datetime の比較(注意点)
タイムゾーン情報(awareなdatetime)を持つオブジェクト同士は比較可能ですが、片方がタイムゾーン無し(naive)だとエラーになります。実運用では UTC に揃えて比較したり、astimezone()で同じタイムゾーンに変換してから比較するのが安全です。
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
dt_utc = datetime.now(timezone.utc)
dt_jp = datetime.now(ZoneInfo("Asia/Tokyo"))
# 同じタイムライン上で比較するには、同じ timezone に揃える
print(dt_jp.astimezone(timezone.utc) > dt_utc)
6. 実務でよくある間違いと対策
代表的なミスは「date と datetime をそのまま比較してエラーになる」「naive と aware を混在させて比較エラーになる」「文字列の日付を直接比較して誤判定する」です。対策としては、
- 比較前に型を揃える(
.date()や.replace(tzinfo=...)を活用) - 日時の保存は UTC に統一し表示時に変換する
- 文字列を比較する前に
strptimeで必ずdatetimeにパースする
7. 文字列を日付に変換して比較する例
外部入力(フォームやCSV)から来る日付は文字列なので、datetime.strptime()でdatetimeにしてから比較します。これで「見た目は同じでも型が違って比較できない」という問題を防げます。
from datetime import datetime
s1 = "2025-01-15 10:00:00"
s2 = "2025-01-15 12:00:00"
dt1 = datetime.strptime(s1, "%Y-%m-%d %H:%M:%S")
dt2 = datetime.strptime(s2, "%Y-%m-%d %H:%M:%S")
print(dt1 < dt2) # True
8. まとめに代わる最後の一言(実践アドバイス)
日付比較はプログラムで頻繁に行う基本操作です。型を揃えること、タイムゾーンに注意すること、文字列は必ずパースすることを守れば安定して扱えます。まずは簡単な比較から始めて、少しずつタイムゾーンや期間計算に慣れていきましょう。