MENU

CSVの日付をpandasで検査する|不正な日を分ける

当ページのリンクには広告(PR)が含まれていることがあります。
CSVの日付をpandasで検査する|不正な日を分ける。日付の文字列、書式を指定、不正な日の一覧の処理例。

日付列に2026-02-30が混ざると、文字の形がそろっていても集計には使えません。反対に、2026/03/01は実在する日ですが、入力をYYYY-MM-DDに決めた表では書式が違います。

pandasでは日付への変換に失敗した値をNaTという欠損値へできます。ただし、元からの空欄まで同じ不備として返すと、入力元が直す場所を判断しにくくなります。書式、実在する日、空欄を分けて確認します。

目次

書式を確かめてから日付へ変換

次の四件は架空の入力です。日付の文字列を残し、前後の空白を除いた後、四桁の年・二桁の月日・ハイフンという条件で検査します。書式に合う値だけを日付へ変換します。

import pandas as pd

df = pd.DataFrame({
    "ID": ["D1", "D2", "D3", "D4"],
    "日付": ["2026-02-28", "2026-02-30", "", "2026/03/01"],
})
text = df["日付"].astype("string").str.strip()
blank = text.eq("")
shape_ok = text.str.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}")
parsed = pd.to_datetime(
    text.where(shape_ok), format="%Y-%m-%d", errors="coerce"
)
invalid = ~blank & (~shape_ok | parsed.isna())

print("不正な日付のID:", df.loc[invalid, "ID"].tolist())
print("空欄のID:", df.loc[blank, "ID"].tolist())
print("有効な日付:", parsed.loc[~invalid & ~blank].dt.strftime("%Y-%m-%d").tolist())
assert df.loc[invalid, "ID"].tolist() == ["D2", "D4"]
assert df.loc[blank, "ID"].tolist() == ["D3"]

D2は存在しない日、D4は書式違いとして不正な日付の一覧へ入ります。D3は空欄だけの一覧に入り、有効な日付はD1の2026-02-28です。Windows・Python 3.12.10・pandas 3.0.2でこの結果を確認しました。

ここでは前後の空白を許容しています。入力の表記まで厳密にそろえる必要があれば、strip前後の差も確認対象にできます。許容する変更を決めず、スラッシュや年の桁数まで推測で直す例にはしていません。

coerceで失敗を見えなくしない

errors="coerce"は読めない日付をNaTへする指定です。空の値へ変えてそのまま保存するためではなく、変換できなかった場所を探すために使っています。

日付で絞り込む処理へNaTをそのまま渡すと、その行が対象外となり、不正な入力が集計から消える場合があります。変換後の欠損数を見るだけでなく、元から空欄だった件数と、新たに変換失敗した件数を分けて記録すると追えます。

IDが重複する入力では、IDだけを確認先として使えません。元ファイルの名前や読み込み順など、対象を特定できる情報も合わせます。氏名など、修正に不要な情報まで一覧へ写さないようにします。

日付の推測を入れる前の確認

03/04/2026のような入力は、月日と日月のどちらの順かを文字だけでは確定できません。dayfirstを付けて読めたことと、入力元が意図した日になったことを分けて考えてください。

この例は、入力形式が決まっているCSV向けです。複数形式を認めるなら、どの入力元がどの形式を使うかを先に定義します。初めは正常日、月末、うるう日、不正日、空欄を含む小さなCSVで、確認表へ出るIDを比べる形が追いやすくなります。

読み込みの基本はpandas入門、入力元で列名が異なる場合はCSV列名の揺れを吸収する方法で確認できます。

参考資料

pandas.to_datetime公式資料を2026年11月1日に確認しました。

この記事を書いた人

Watanabeのアバター Watanabe サイト運営者

2020年よりブログ開始。
SEOが思いのほか性にあっていたようで現在に至る。
モットーは「勝率の高い選択をする」
AIは活用するが吉、最後は人間が息を吹き込む。
アートと科学を追求し、日々精進。
―――
収益:6~7桁をウゴウゴ。
サイト:ペラサイト~中規模サイトまで運営中。
案件:1000円以上の案件をメインに取組中。
打ち手:ブラックSEO~ホワイトSEOまで
―――

目次