🐍 日付と時間の計算は「ライブラリ任せ」が正解
「3か月前の日付を出したい」「来週の同じ曜日を取得したい」「うるう年も考慮して2月の月末日を知りたい」——Pythonでこうした処理を自力で書こうとすると、意外と泥沼にハマります。月ごとに日数が違う、うるう年のルールがややこしい、月またぎの計算で1日ずれる……。📅
でも安心してください。Pythonには日付計算を驚くほどスマートに書けるライブラリがそろっています。dateutil の relativedelta と、標準ライブラリの calendar モジュール——この2つを押さえれば、面倒な日付ロジックから一気に解放されます。✨
📘 そもそも:datetimeだけだと何が足りない?
Python標準の datetime モジュールは便利ですが、組み込みの timedelta では「日・時・分・秒」までしか加減算できません。つまり「3か月後」「1年前」のように月や年単位の計算がストレートにはできないのです。
「30日 × 3 で3か月にすればいい?」——いいえ、月によって日数が違うので、これでは正確になりません。ここで活躍するのが dateutil ライブラリの relativedelta です。💡
🚀 relativedelta:年・月・日・時・分・秒を自由自在に
インストールとインポート
dateutil は標準ライブラリではないので、未導入の場合はインストールが必要です。
pip install python-dateutil
使うときはこう書きます。datetime モジュールと名前が似ていてややこしいので注意してください。
from dateutil.relativedelta import relativedelta
from datetime import datetime
基本の使い方:明日・昨日を取得する
now = datetime.now()
# 1日後(明日)
tomorrow = now + relativedelta(days=1)
# 1日前(昨日)
yesterday = now - relativedelta(days=1)
datetime オブジェクトに relativedelta を足したり引いたりするだけ。結果も datetime オブジェクトで返ってくるのでそのまま次の処理に渡せます。👍
年・月・週・時・分・秒すべて対応
キーワード引数を変えるだけで、さまざまな単位の加減算ができます。
- 📌
years=1:1年単位 - 📌
months=1:1か月単位 - 📌
weeks=1:1週間単位 - 📌
days=1:1日単位 - 📌
hours=1:1時間単位 - 📌
minutes=1:1分単位 - 📌
seconds=1:1秒単位
実例:7か月前の日付を取得する
from datetime import datetime
from dateutil.relativedelta import relativedelta
now = datetime.now()
result = now - relativedelta(months=7)
print(result)
今日が「2025年6月13日」なら、結果は 2024年11月13日。月ごとの日数差を気にせずに、直感的に書いたとおりの計算結果が返ってきます。これがライブラリ任せの威力です。⚡
🔤 datetimeオブジェクトを文字列に変換:strftime
日付をログや画面に表示するには、文字列に変換する必要があります。そこで使うのが strftime メソッドです。
now = datetime.now()
print(now.strftime("%Y年%m月%d日 %H時%M分%S秒"))
# 例: 2025年06月13日 14時23分05秒
print(now.strftime("%Y/%m/%d"))
# 例: 2025/06/13
覚えておきたいフォーマット指定子
- 📌
%Y:年(4桁、例:2025) - 📌
%m:月(2桁ゼロ埋め、例:06) - 📌
%d:日(2桁ゼロ埋め、例:13) - 📌
%H:時(24時間表記、2桁) - 📌
%M:分(2桁) - 📌
%S:秒(2桁)
基本的にすべてゼロ埋めされた文字列になります。1月なら「01」、2日なら「02」のように整った表示になるので、ファイル名やログ出力にもそのまま使えます。📝
📅 calendarモジュール:月末日の取得が一瞬で終わる
「2月の月末日って何日?」と聞かれて即答できますか? 平年なら28日、うるう年なら29日。さらに「うるう年とは4で割り切れる年。ただし100で割り切れる年は除外。ただし400で割り切れる年は含める」……このロジックを自前で書くのは正直つらいです。😩
そこで使えるのが標準ライブラリの calendar モジュール。monthrange() 関数を使えば、月末日が1行で取得できます。
monthrangeで月末日を取得
import calendar
# 2020年2月(うるう年)
week_day, last_day = calendar.monthrange(2020, 2)
print(last_day) # 29
# 2021年5月
week_day, last_day = calendar.monthrange(2021, 5)
print(last_day) # 31
monthrange(year, month) はタプルを返し、1つ目の要素はその月の1日が何曜日か(0が月曜〜6が日曜)、2つ目の要素がその月の日数(=月末日)です。うるう年ロジックを書く必要は一切なし。これだけでスッキリ書けます。✨
カレンダー文字列の取得もカンタン
import calendar
print(calendar.month(2025, 1))
こうすると、その月のカレンダーが整形済みの文字列として出力されます。CLIツールなどでサクッと表示したいときに便利です。
📚 Python日付処理の理解を加速する厳選アイテム
日付・時間の操作は実務でとにかく出番が多い領域。レポート作成、ログ集計、予約システム、データ分析……どこに行ってもついて回ります。手元に良書を1冊置いておくと、つまずいたときの心強さがまったく違います。
🌱 まずはPython全体を体系的に:『スッキリわかるPython入門』
文法・標準ライブラリの使い方を体系的に学べる定番書。datetime をはじめとした標準モジュールの全体像が掴めます。
📖 実務でPythonを使いこなす:『Python実践入門』
標準ライブラリの活用法や、Pythonらしい書き方を深く学べる1冊。dateutil のような外部ライブラリとの付き合い方も自然と身につきます。
📊 データ分析の現場で日付処理を極める:『Pythonによるデータ分析入門』
pandasによる時系列処理は、日付計算の応用編。日付処理をマスターしたら、ぜひデータ分析の世界へ進みましょう。
🤖 学んだPythonを即実用へ:『退屈なことはPythonにやらせよう』
日付処理は自動化スクリプトでも頻出。ファイル名に日付を付けたり、定期処理を書いたり——実用シーンの宝庫です。
⌨️ 長時間コーディングを支える相棒キーボード
日付処理の試行錯誤は意外とタイピングが多い作業。打鍵感が良く、複数デバイス切替にも対応した一台があると、集中力が長く続きます。
❓ よくある質問(FAQ)
🤔 Q1. timedeltaとrelativedelta、どう使い分ける?
標準ライブラリの timedelta は日・時・分・秒までの計算用。週単位もキーワード引数で扱えます。一方、「3か月後」「1年前」のように月や年単位の計算をしたいときは relativedelta が必要です。日数ベースで済むなら標準のtimedeltaでOKです。
🤔 Q2. dateutilは標準ライブラリ?
いいえ、外部ライブラリです。pip install python-dateutil でインストールする必要があります。ただしpandasなどの主要ライブラリの依存先になっているため、データ分析環境ではすでに入っていることも多いです。
🤔 Q3. strftimeとstrptimeの違いは?
strftime は datetime オブジェクト → 文字列の変換、strptime は文字列 → datetime オブジェクトの変換です。「f は format(書き出す)」「p は parse(読み取る)」と覚えると混乱しません。👌
🤔 Q4. うるう年判定を自分で書く必要はある?
基本的には不要です。calendar.isleap(year) でうるう年判定ができますし、月末日も calendar.monthrange() で一発取得できます。標準ライブラリを使うほうが圧倒的にバグが少なく、コードもスマートになります。✨
🤔 Q5. タイムゾーンを考慮した日付計算はできる?
はい、datetime オブジェクトに tzinfo を設定すればOKです。サードパーティ製では zoneinfo(Python 3.9以降は標準)や pytz が定番。Webアプリやグローバルサービスを扱うなら、タイムゾーン対応は必須スキルです。🌍
🎯 まとめ:日付処理は「賢いライブラリ」に任せて時間を生み出す
日付と時間の計算は、自前で書けば書くほどバグが入り込みやすい領域です。dateutil.relativedelta で年・月・日・時・分・秒の柔軟な計算を、calendar モジュールで月末日やうるう年判定を——それぞれライブラリに任せることで、コードは短く、読みやすく、バグも少なくなります。🚀
「30日 × 3 で3か月」みたいなごまかしロジックを書く時代はもう終わり。今日紹介した関数を引き出しに入れておくだけで、明日からの開発効率は確実に上がります。手を動かして覚えて、あなたのPythonコードに“スマートさ”を加えていきましょう。💪










































コメント