【Python】日付を比較して大小を判定する方法

この記事では、Pythonの基本的な日付の比較方法から、実践的な例、さらには文字列形式の日付の扱い方まで、初心者でもわかりやすく解説します。

日付の大小を判定する方法や、日付の範囲チェック、日付のソート方法など、日付を扱う上で役立つ情報が満載です。

さらに、よくあるエラーとその対処法についても説明しますので、安心して日付の操作を行えるようになります。

目次から探す

日付の比較方法

Pythonでは、日付を比較するためにいくつかの方法があります。

ここでは、比較演算子とtimedeltaを使った方法について詳しく解説します。

比較演算子を使った日付の比較

Pythonの標準ライブラリであるdatetimeモジュールを使うと、日付を簡単に比較することができます。

以下に、各比較演算子を使った日付の比較方法を紹介します。

== 演算子

== 演算子を使うと、2つの日付が等しいかどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 1)
# 日付が等しいかどうかを判定
print(date1 == date2)  # 出力: True

!= 演算子

!= 演算子を使うと、2つの日付が異なるかどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 2)
# 日付が異なるかどうかを判定
print(date1 != date2)  # 出力: True

< 演算子

< 演算子を使うと、左側の日付が右側の日付よりも前かどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 2)
# date1がdate2よりも前かどうかを判定
print(date1 < date2)  # 出力: True

<= 演算子

<= 演算子を使うと、左側の日付が右側の日付よりも前か、または同じかどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 1)
# date1がdate2よりも前か、または同じかどうかを判定
print(date1 <= date2)  # 出力: True

> 演算子

> 演算子を使うと、左側の日付が右側の日付よりも後かどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 2)
date2 = datetime(2023, 10, 1)
# date1がdate2よりも後かどうかを判定
print(date1 > date2)  # 出力: True

>= 演算子

>= 演算子を使うと、左側の日付が右側の日付よりも後か、または同じかどうかを判定できます。

from datetime import datetime
date1 = datetime(2023, 10, 2)
date2 = datetime(2023, 10, 1)
# date1がdate2よりも後か、または同じかどうかを判定
print(date1 >= date2)  # 出力: True

timedeltaを使った日付の差分計算

timedeltaオブジェクトを使うと、日付の差分を計算することができます。

これにより、日付の比較や範囲のチェックが簡単に行えます。

timedeltaオブジェクトの作成

timedeltaオブジェクトは、日付や時間の差分を表現するために使われます。

以下の例では、1日の差分を表すtimedeltaオブジェクトを作成します。

from datetime import timedelta
# 1日の差分を表すtimedeltaオブジェクトを作成
one_day = timedelta(days=1)
print(one_day)  # 出力: 1 day, 0:00:00

日付の差分を計算する方法

2つの日付の差分を計算するには、単純に引き算を行います。

結果はtimedeltaオブジェクトとして返されます。

from datetime import datetime, timedelta
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 2)
# 日付の差分を計算
difference = date2 - date1
print(difference)  # 出力: 1 day, 0:00:00

差分を使った比較

timedeltaオブジェクトを使って、日付の差分を比較することもできます。

例えば、2つの日付が1日以上離れているかどうかを判定する場合は以下のようにします。

from datetime import datetime, timedelta
date1 = datetime(2023, 10, 1)
date2 = datetime(2023, 10, 3)
# 1日の差分を表すtimedeltaオブジェクトを作成
one_day = timedelta(days=1)
# 日付の差分を計算
difference = date2 - date1
# 差分が1日以上かどうかを判定
print(difference >= one_day)  # 出力: True

以上が、Pythonで日付を比較するための基本的な方法です。

これらの方法を使えば、日付の大小を簡単に判定することができます。

実践的な日付比較の例

ここでは、実際に日付を比較する具体的な例をいくつか紹介します。

これらの例を通じて、日付の比較方法をより深く理解しましょう。

未来の日付と過去の日付の判定

日付が未来か過去かを判定する方法について説明します。

未来の日付かどうかを判定する

未来の日付かどうかを判定するには、現在の日付と比較します。

以下のコード例では、datetimeモジュールを使用して現在の日付と指定の日付を比較しています。

from datetime import datetime
# 現在の日付を取得
now = datetime.now()
# 比較する日付を設定
future_date = datetime(2025, 1, 1)
# 未来の日付かどうかを判定
if future_date > now:
    print("指定の日付は未来の日付です。")
else:
    print("指定の日付は未来の日付ではありません。")

このコードを実行すると、指定した日付が未来の日付かどうかが判定されます。

過去の日付かどうかを判定する

過去の日付かどうかを判定する方法も同様です。

以下のコード例では、現在の日付と指定の日付を比較して過去の日付かどうかを判定しています。

from datetime import datetime
# 現在の日付を取得
now = datetime.now()
# 比較する日付を設定
past_date = datetime(2020, 1, 1)
# 過去の日付かどうかを判定
if past_date < now:
    print("指定の日付は過去の日付です。")
else:
    print("指定の日付は過去の日付ではありません。")

このコードを実行すると、指定した日付が過去の日付かどうかが判定されます。

日付範囲のチェック

特定の日付が指定した範囲内にあるかどうかを判定する方法について説明します。

特定の日付が範囲内にあるかを判定する

特定の日付が範囲内にあるかどうかを判定するには、開始日と終了日を設定し、その範囲内に特定の日付が含まれているかを確認します。

from datetime import datetime
# 範囲の開始日と終了日を設定
start_date = datetime(2021, 1, 1)
end_date = datetime(2021, 12, 31)
# 比較する日付を設定
check_date = datetime(2021, 6, 15)
# 範囲内にあるかどうかを判定
if start_date <= check_date <= end_date:
    print("指定の日付は範囲内にあります。")
else:
    print("指定の日付は範囲内にありません。")

このコードを実行すると、指定した日付が範囲内にあるかどうかが判定されます。

範囲外の日付を判定する

範囲外の日付を判定する方法も同様です。

以下のコード例では、特定の日付が範囲外にあるかどうかを判定しています。

from datetime import datetime
# 範囲の開始日と終了日を設定
start_date = datetime(2021, 1, 1)
end_date = datetime(2021, 12, 31)
# 比較する日付を設定
check_date = datetime(2022, 1, 1)
# 範囲外にあるかどうかを判定
if check_date < start_date or check_date > end_date:
    print("指定の日付は範囲外にあります。")
else:
    print("指定の日付は範囲外にありません。")

このコードを実行すると、指定した日付が範囲外にあるかどうかが判定されます。

日付のソート

日付のリストをソートする方法について説明します。

日付のリストをソートする方法

日付のリストをソートするには、sorted関数を使用します。

以下のコード例では、日付のリストを昇順にソートしています。

from datetime import datetime
# 日付のリストを作成
dates = [
    datetime(2021, 5, 1),
    datetime(2020, 1, 1),
    datetime(2022, 3, 15),
    datetime(2021, 7, 20)
]
# 日付のリストをソート
sorted_dates = sorted(dates)
# ソートされた日付のリストを表示
for date in sorted_dates:
    print(date.strftime("%Y-%m-%d"))

このコードを実行すると、日付のリストが昇順にソートされて表示されます。

ソートされた日付リストの活用例

ソートされた日付リストは、例えばイベントのスケジュール管理やデータの時系列分析などに活用できます。

以下のコード例では、ソートされた日付リストを使ってイベントのスケジュールを表示しています。

from datetime import datetime
# イベントの日付と名前のリストを作成
events = [
    {"date": datetime(2021, 5, 1), "name": "イベントA"},
    {"date": datetime(2020, 1, 1), "name": "イベントB"},
    {"date": datetime(2022, 3, 15), "name": "イベントC"},
    {"date": datetime(2021, 7, 20), "name": "イベントD"}
]
# イベントの日付でソート
sorted_events = sorted(events, key=lambda x: x["date"])
# ソートされたイベントのスケジュールを表示
for event in sorted_events:
    print(f"{event['date'].strftime('%Y-%m-%d')}: {event['name']}")

このコードを実行すると、イベントが日付順にソートされて表示されます。

これにより、イベントのスケジュールを簡単に管理することができます。

応用編:文字列形式の日付の比較

日付を扱う際、文字列形式で日付が与えられることがよくあります。

例えば、ユーザー入力や外部データベースから取得したデータなどです。

このような場合、文字列形式の日付を直接比較するのは避けるべきです。

まずは、文字列形式の日付をdatetimeオブジェクトに変換し、その後で比較を行うのが一般的です。

文字列形式の日付をdatetimeオブジェクトに変換

strptime関数の使い方

Pythonのdatetimeモジュールには、文字列形式の日付をdatetimeオブジェクトに変換するためのstrptime関数があります。

この関数は、指定したフォーマットに従って文字列を解析し、datetimeオブジェクトを生成します。

from datetime import datetime
# 文字列形式の日付
date_str = "2023-10-01"
# 文字列をdatetimeオブジェクトに変換
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
print(date_obj)  # 出力: 2023-10-01 00:00:00

上記の例では、%Y%m%dというフォーマットを指定しています。

%Yは4桁の年、%mは2桁の月、%dは2桁の日を表します。

文字列からdatetimeオブジェクトへの変換例

以下に、いくつかの異なるフォーマットの文字列をdatetimeオブジェクトに変換する例を示します。

from datetime import datetime
# 文字列形式の日付
date_str1 = "01/10/2023"
date_str2 = "2023年10月01日"
date_str3 = "2023-10-01 15:30:00"
# 文字列をdatetimeオブジェクトに変換
date_obj1 = datetime.strptime(date_str1, "%d/%m/%Y")
date_obj2 = datetime.strptime(date_str2, "%Y年%m月%d日")
date_obj3 = datetime.strptime(date_str3, "%Y-%m-%d %H:%M:%S")
print(date_obj1)  # 出力: 2023-10-01 00:00:00
print(date_obj2)  # 出力: 2023-10-01 00:00:00
print(date_obj3)  # 出力: 2023-10-01 15:30:00

文字列形式の日付の比較

変換後のdatetimeオブジェクトを使った比較

文字列形式の日付をdatetimeオブジェクトに変換した後は、通常の比較演算子を使って日付の比較ができます。

from datetime import datetime
# 文字列形式の日付
date_str1 = "2023-10-01"
date_str2 = "2023-10-05"
# 文字列をdatetimeオブジェクトに変換
date_obj1 = datetime.strptime(date_str1, "%Y-%m-%d")
date_obj2 = datetime.strptime(date_str2, "%Y-%m-%d")
# 日付の比較
if date_obj1 < date_obj2:
    print(f"{date_str1}は{date_str2}より前の日付です。")
else:
    print(f"{date_str1}は{date_str2}より後の日付です。")

文字列形式の日付の直接比較の注意点

文字列形式の日付を直接比較することも可能ですが、フォーマットによっては正しい結果が得られないことがあります。

例えば、2023-10-012023-9-30を比較すると、文字列としては2023-9-30の方が大きくなりますが、実際の日付としては2023-10-01の方が後の日付です。

# 文字列形式の日付の直接比較
date_str1 = "2023-10-01"
date_str2 = "2023-9-30"
if date_str1 > date_str2:
    print(f"{date_str1}は{date_str2}より後の日付です。")
else:
    print(f"{date_str1}は{date_str2}より前の日付です。")

このような誤りを避けるためにも、文字列形式の日付は必ずdatetimeオブジェクトに変換してから比較することをお勧めします。

よくあるエラーとその対処法

Pythonで日付を比較する際には、いくつかのエラーが発生することがあります。

ここでは、よくあるエラーとその対処法について解説します。

TypeErrorの対処法

datetimeオブジェクトと文字列の比較によるエラー

Pythonでは、異なる型同士を比較しようとすると TypeError が発生します。

特に、datetimeオブジェクトと文字列を直接比較しようとすると、このエラーが発生します。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2 = "2023-10-01"
# これはTypeErrorを引き起こします
print(date1 > date2)

このコードを実行すると、以下のようなエラーが発生します。

TypeError: '>' not supported between instances of 'datetime.datetime' and 'str'

適切な型変換の方法

このエラーを回避するためには、文字列を datetimeオブジェクトに変換する必要があります。

Pythonの datetime モジュールには、文字列を datetimeオブジェクトに変換するための strptime関数があります。

from datetime import datetime
date1 = datetime(2023, 10, 1)
date2_str = "2023-10-01"
date2 = datetime.strptime(date2_str, "%Y-%m-%d")
# これで比較が可能になります
print(date1 > date2)  # False

このように、文字列を適切なフォーマットで datetimeオブジェクトに変換することで、比較が可能になります。

ValueErrorの対処法

不正な日付フォーマットによるエラー

strptime関数を使用する際に、文字列のフォーマットが正しくないと ValueError が発生します。

from datetime import datetime
date_str = "2023/10/01"
# これはValueErrorを引き起こします
date = datetime.strptime(date_str, "%Y-%m-%d")

このコードを実行すると、以下のようなエラーが発生します。

ValueError: time data '2023/10/01' does not match format '%Y-%m-%d'

フォーマットの確認と修正方法

このエラーを回避するためには、文字列のフォーマットが正しいことを確認する必要があります。

例えば、スラッシュ(/)で区切られた日付文字列を処理する場合は、適切なフォーマットを指定します。

from datetime import datetime
date_str = "2023/10/01"
date = datetime.strptime(date_str, "%Y/%m/%d")
print(date)  # 2023-10-01 00:00:00

このように、文字列のフォーマットが正しいことを確認し、適切なフォーマットを指定することで ValueError を回避できます。

以上が、Pythonで日付を比較する際によく発生するエラーとその対処法です。

これらのポイントを押さえておくことで、日付の比較をスムーズに行うことができます。

目次から探す