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を使いこなすことで、実務レベルの柔軟な日付処理が可能になります。
学習のコツは、いろいろな日付を例に試してみることです。うるう年・月末・月初なども含めて、日付処理の“クセ”を体験することが上達の近道です。