Python|1年後・1年前の日付を求める

1. はじめに

Pythonで日付操作を行う際、「1年後」や「1年前」の日付を求めたい場面は多々あります。たとえば、定期契約の更新日、保険の有効期限、データ処理における1年前のデータの抽出など、実務でも頻出の処理です。

本記事では、Pythonで「1年後・1年前の日付を求める」方法について、初心者にもわかりやすく丁寧に解説します。datetimeモジュールやdateutilライブラリを活用し、実行結果付きのコード例を多数紹介します。

 

2. Pythonで日付を1年加算・減算する基本解説

2-1. datetimeモジュールでは1年の加減算が難しい理由

Python標準ライブラリのdatetimeでは、timedeltaで日数の加減算は簡単に行えます。しかし、1年のような可変な日数(うるう年を含む)には対応していません。

from datetime import datetime, timedelta

today = datetime.today()
one_year_later = today + timedelta(days=365)
print("1年後の日付(暫定):", one_year_later.strftime('%Y-%m-%d'))

実行結果:

1年後の日付(暫定): 2026-07-23

この方法では「厳密な1年後」ではなく、「365日後」になります。うるう年や月末日などを正確に扱いたい場合は、外部ライブラリ dateutil の relativedelta を使うのが一般的です。

2-2. dateutil.relativedeltaを使って正確な1年後・1年前を取得

dateutilはPythonで日付の加減算を柔軟に行うための強力なライブラリで、relativedeltaを使うことで「1年」や「1か月」単位での操作が可能です。

from datetime import datetime
from dateutil.relativedelta import relativedelta

today = datetime.today()
one_year_later = today + relativedelta(years=1)
one_year_ago = today - relativedelta(years=1)

print("今日の日付:", today.strftime('%Y-%m-%d'))
print("1年後の日付:", one_year_later.strftime('%Y-%m-%d'))
print("1年前の日付:", one_year_ago.strftime('%Y-%m-%d'))

実行結果:

今日の日付: 2025-07-23
1年後の日付: 2026-07-23
1年前の日付: 2024-07-23

このように、relativedelta(years=1)を使えば「1年後」「1年前」の日付を簡単かつ正確に取得できます。

 

3. よくある使い方・応用例

3-1. 月末日の処理にも対応可能

たとえば「2020-02-29」の1年後は「2021-02-28」となるべきです。relativedeltaはこのようなうるう年にも自動で対応してくれます。

from datetime import datetime
from dateutil.relativedelta import relativedelta

leap_day = datetime(2020, 2, 29)
one_year_later = leap_day + relativedelta(years=1)
print("2020年2月29日の1年後:", one_year_later.strftime('%Y-%m-%d'))

実行結果:

2020年2月29日の1年後: 2021-02-28

3-2. 日付データの一括処理

複数の日付に対して1年前のデータを処理する場合にも、リスト内包表記などを使えば効率的です。

from datetime import datetime
from dateutil.relativedelta import relativedelta

dates = [
    datetime(2023, 3, 15),
    datetime(2022, 7, 10),
    datetime(2021, 1, 1)
]

one_year_ago_dates = [d - relativedelta(years=1) for d in dates]

for original, shifted in zip(dates, one_year_ago_dates):
    print(f"{original.strftime('%Y-%m-%d')} → {shifted.strftime('%Y-%m-%d')}")

実行結果:

2023-03-15 → 2022-03-15
2022-07-10 → 2021-07-10
2021-01-01 → 2020-01-01

3-3. データ分析・期限管理での活用例

  • 売上データの前年同期比較
  • 有効期限の自動計算(1年契約など)
  • 日付ベースのフィルタリング処理

例えば、Pandasで過去1年分のデータだけを抽出する際にも、relativedeltaを使えば柔軟な範囲指定が可能です。

 

4. 注意点・エラー対策

4-1. dateutilは標準ライブラリではない

dateutilはPythonの標準ライブラリではないため、利用前にインストールが必要です。以下のコマンドを実行してください。

pip install python-dateutil

4-2. 月末処理の注意点

月末日(例:1月31日)に対してrelativedelta(months=1)を加算すると、2月には「30日」や「31日」が存在しないため、最終日である「28日」または「29日」に自動調整されます。この挙動を正確に理解しておくことが重要です。

4-3. 文字列と日付の変換ミス

文字列として読み込んだ日付をそのまま加減算しようとしてエラーになることがあります。strptime()strftime()を使って明示的に変換しましょう。

 

5. まとめ

本記事では、Pythonで「1年後・1年前の日付を求める」方法について詳しく解説しました。標準のtimedeltaでは1年の加減算が難しいため、dateutil.relativedeltaを活用することが最も実用的です。

日付操作はデータ処理や業務アプリケーション、レポート作成など幅広い場面で役立ちます。relativedeltaを使いこなすことで、実務レベルの柔軟な日付処理が可能になります。

学習のコツは、いろいろな日付を例に試してみることです。うるう年・月末・月初なども含めて、日付処理の“クセ”を体験することが上達の近道です。

タイトルとURLをコピーしました