Pythonで日付の妥当性を検証する方法!strptimeの使い方と書式指定子一覧
Pythonで日付の妥当性検証(バリデーション)を行う方法は、扱う日付データの形式によって大きく異なります。最も一般的なのは、datetimeモジュールが提供するstrptime()関数を使って、文字列を日付・時刻オブジェクトに変換する方法です。この関数は指定した書式に一致しない文字列を受け取ると例外を発生させるため、それを利用して日付が正しいかどうかを判定できます。
strptime()を使った基本的な日付検証
以下は、文字列が「YYYY-MM-DD」形式の有効な日付であるかを確認するサンプルコードです。
import datetime
date_string = '2017-12-31'
date_format = '%Y-%m-%d'
try:
date_obj = datetime.datetime.strptime(date_string, date_format)
print(date_obj)
except ValueError:
print("日付の形式が正しくありません。YYYY-MM-DD形式で入力してください")
実行結果
このコードを実行すると、次のような出力が得られます。
2017-12-31 00:00:00
もしdate_stringに「2017-13-31」のような存在しない日付や、形式に合わない文字列を渡すと、ValueErrorが発生し、exceptブロックのメッセージが表示されます。これにより、無効な日付を確実に検出できます。
strptime()で使える主な書式指定子
strptime()では、さまざまな書式指定子(ディレクティブ)を組み合わせて日付を解析できます。代表的な指定子は以下の通りです。
| 指定子 | 意味 |
| %a | ロケールにおける曜日の省略名(例:Mon、月) |
| %A | ロケールにおける曜日の完全な名前(例:Monday、月曜日) |
| %b | ロケールにおける月の省略名(例:Jan、1月) |
| %B | ロケールにおける月の完全な名前(例:January、1月) |
| %c | ロケールに適した日付と時刻の表現 |
| %d | 月の中の日。10進数で表記(01〜31) |
| %H | 時(24時間制)。10進数で表記(00〜23) |
| %I | 時(12時間制)。10進数で表記(01〜12) |
| %j | 年内の通算日。10進数で表記(001〜366) |
| %m | 月。10進数で表記(01〜12) |
| %M | 分。10進数で表記(00〜59) |
| %p | ロケールにおけるAM/PMに相当する表現 |
| %S | 秒。10進数で表記(00〜61)※うるう秒も考慮 |
| %U | 年内の週番号(日曜日を週の始まりとする)。10進数で表記(00〜53)。新年の最初の日曜日より前の日は週0として扱われます |
| %w | 曜日を10進数で表記(0が日曜日、6が土曜日) |
| %W | 年内の週番号(月曜日を週の始まりとする)。10進数で表記(00〜53)。新年の最初の月曜日より前の日は週0として扱われます |
| %x | ロケールに適した日付の表現 |
| %X | ロケールに適した時刻の表現 |
| %y | 世紀を含まない年。10進数で表記(00〜99) |
| %Y | 世紀を含む年。10進数で表記(例:2017) |
| %Z | タイムゾーン名(タイムゾーンが存在しない場合は空文字列) |
| %% | リテラルの「%」文字そのもの |
補足:ISO形式ならfromisoformat()も便利
Python 3.7以降では、「YYYY-MM-DD」のようなISO 8601形式の日付文字列であれば、datetime.date.fromisoformat()を使うとよりシンプルに検証できます。
import datetime
try:
date_obj = datetime.date.fromisoformat('2017-12-31')
print(date_obj)
except ValueError:
print("無効な日付です")
用途に応じてstrptime()とfromisoformat()を使い分けることで、柔軟かつ堅牢な日付バリデーションを実装できます。
-
Pythonで10進数を2進数に変換する方法|再帰処理とbin()関数の実装例
この記事では、「10進数を2進数に変換する」という問題に対する解決策を、具体的なコード例とともにわかりやすく解説します。 問題の概要 問題: 与えられた10進数の整数を、それに対応する2進数表現へ変換する。 この問題を解くには、大きく分けて2つのアプローチがあります。順番に見ていきましょう。 方法1:再帰を使った実装 10進数を2進数に変換する基本的な考え方は、「数値を2で割り続け、その余りを記録する」ことです。再帰関数を使うと、除算を繰り返しながら余りを自動的に上位の桁から順に出力できます。 サンプルコード def DecimalToBinary(num): if num &g
-
Pythonで与えられた数値がフィボナッチ数かどうかを判定する方法
本記事では、与えられた数値がフィボナッチ数であるかどうかを判定する問題の解決策について解説します。 問題の定義 ある数値 n が与えられたとき、その数値がフィボナッチ数であるかどうかを判定します。 第 n 項のフィボナッチ数は、直前の2つのフィボナッチ数の和として定義されることは広く知られています。しかし、フィボナッチ数列には漸化式以外にも興味深い数学的性質があります。 フィボナッチ数の判定条件 ある数値 n がフィボナッチ数であるのは、「5×n² + 4」または「5×n² − 4」のいずれかが完全平方数であるとき、かつそのときに限る この性質を利用すれば、フィボナッチ数列を実際に生成しなくて