Excel・CSVの日付表記をまとめて統一する方法|Google Colab+Pythonで自動変換

Google ColabとPythonを使ってExcel・CSVの異なる日付表記を統一し、不正な日付や空欄を抽出する方法 Python・データ処理

「同じ日付なのに、CSVによって『2026/10/01』『2026-10-01』『2026年10月1日』と表記がバラバラになっている。」

そんなことはありませんか?

売上データや注文履歴など、複数の取引先・部署・システムから集めたCSVでは、日付の書き方が統一されていないことがあります。

例えば、

2026/10/01
2026-10-02
2026年10月3日
2026.10.04
20261005

のように、スラッシュ・ハイフン・日本語表記などが混在しているケースです。

この状態のままでは、

  • 日付を使った並び替えや集計がうまくいかない
  • 同じ日付でも表記が異なるため、データの照合に手間がかかる
  • システムへCSVを取り込む前に、毎回日付を修正する必要がある
  • 不正な日付や入力漏れを見落とす

といった問題が起きやすくなります。

この記事では、Google ColabとPythonを使って、CSV内のバラバラな日付表記をまとめて統一する方法を紹介します。

今回は実際に、

  • 5種類の日付表記を統一
  • 元の日付データを残したまま新しい列を追加
  • 変換できなかったデータを抽出
  • 未変換の理由を確認用の列に表示
  • 変換結果と確認対象を別々のCSVに保存
  • 保存後に再読み込みし、データの一致を確認

まで動作確認しました。

PythonをPCへインストールする必要はありません。

「毎回Excelで日付を書き換えたり、不正な日付を探したりしている」作業を減らしたい人向けの記事です。

✅ この記事は実際に動作検証しています

5種類の日付表記を含む7件のテストデータをGoogle Colabで処理し、YYYY-MM-DD形式へ統一しました。不正な日付と空欄は未変換データとして抽出し、保存したCSVを再読み込みして内容も確認しています。

検証結果: 7件中5件を変換 / 未変換2件を抽出 / 保存後データ一致:True / インデックス差による比較エラーも修正して確認

この記事はこんな人向け

  • CSVの日付表記がスラッシュ・ハイフン・日本語表記などで混在している
  • 注文日や売上日を同じ形式に統一したい
  • 日付をExcelで1件ずつ修正している
  • 入力ミスや空欄の日付を自動で見つけたい
  • 元のデータを残したまま変換したい
  • CSVを別のシステムへ取り込む前に形式を揃えたい

この記事でできるようになること

今回の方法では、例えば次のように異なる日付表記を、

2026/10/01
2026-10-02
2026年10月3日
2026.10.04
20261005

次の形式へまとめて統一します。

2026-10-01
2026-10-02
2026-10-03
2026-10-04
2026-10-05

今回は、年・月・日をハイフンで区切る YYYY-MM-DD 形式に揃えます。

また、

2026/13/01

のような存在しない日付や、日付が入力されていない空欄は、勝手に推測して変換しません。

確認が必要なデータとして、別のCSVに抽出します。

最終的には、

日付表記がバラバラなCSV
↓
5種類の日付形式を判定
↓
YYYY-MM-DD形式に統一
↓
変換できなかったデータを抽出
↓
全データと確認対象を別々にCSV保存
↓
保存前後のデータを確認

という流れです。

今回は元の日付を上書きせず、変換後の日付を新しい列へ追加する構成にします。

今回使うデータ

今回は、注文履歴を想定した7件のデータを使用します。

注文番号注文日商品名売上
A0012026/10/01りんご1200
A0022026-10-02みかん1500
A0032026年10月3日ぶどう2000
A0042026.10.04もも1800
A00520261005いちご2200
A0062026/13/01なし1600
A007(空欄)メロン2500

このうち、A001〜A005は日付の変換対象です。

A006の「2026/13/01」は13月が存在しないため、正しい日付に変換できません。また、A007は注文日が空欄です。

今回はこれらを含む7件を、

date_format_test.csv

というファイル名で使用します。

Google Colabで検証用CSVを作成する

まず、Google Colabで新しいノートブックを作成します。

Google Colabを開く

今回は、

TaskLess Lab_CSV日付統一テスト

という名前にしました。

新しいコードセルに、以下を貼り付けて実行します。

import pandas as pd

# 日付表記がバラバラな検証用データ
df = pd.DataFrame({
    "注文番号": [
        "A001", "A002", "A003", "A004",
        "A005", "A006", "A007"
    ],
    "注文日": [
        "2026/10/01",
        "2026-10-02",
        "2026年10月3日",
        "2026.10.04",
        "20261005",
        "2026/13/01",
        ""
    ],
    "商品名": [
        "りんご", "みかん", "ぶどう", "もも",
        "いちご", "なし", "メロン"
    ],
    "売上": [
        1200, 1500, 2000, 1800,
        2200, 1600, 2500
    ]
})

# CSVとして保存
df.to_csv(
    "date_format_test.csv",
    index=False,
    encoding="utf-8-sig"
)

print("日付表記の検証用CSVを作成しました")
print("データ件数:", len(df))

display(df)

実行すると、Google Colabの左側のファイル一覧に、

date_format_test.csv

が生成されます。

今回の検証では、7件のデータが正常に表示され、日付表記がバラバラな状態を確認できました。

5種類の日付表記をまとめて統一する

次に、CSVの「注文日」を YYYY-MM-DD 形式へ変換します。

今回は、Pythonに日付の形式をすべて推測させるのではなく、対応する5種類の形式をあらかじめ指定します。

変換前の形式Pythonで指定する形式
2026/10/01%Y/%m/%d
2026-10-02%Y-%m-%d
2026年10月3日%Y年%m月%d日
2026.10.04%Y.%m.%d
20261005%Y%m%d

それぞれの形式を順番に試し、変換できたものだけを統一します。

今回使用した変換コード

import pandas as pd
from datetime import datetime

# 元のCSVを読み込む
# 元の日付を文字列として保持する
df = pd.read_csv(
    "date_format_test.csv",
    encoding="utf-8-sig",
    dtype=str,
    keep_default_na=False
)

# 対応する日付形式
date_formats = [
    "%Y/%m/%d",
    "%Y-%m-%d",
    "%Y年%m月%d日",
    "%Y.%m.%d",
    "%Y%m%d"
]

# 日付変換用の関数
def normalize_date(value):

    # 前後の余分な空白を削除
    value = str(value).strip()

    # 空欄は変換せず、空文字を返す
    if not value:
        return ""

    # 指定した形式を順番に試す
    for date_format in date_formats:
        try:
            parsed_date = datetime.strptime(
                value,
                date_format
            )

            return parsed_date.strftime("%Y-%m-%d")

        except ValueError:
            continue

    # どの形式でも変換できなかった場合
    return ""

# 元の日付は残したまま、新しい列を追加
df["注文日_統一後"] = df["注文日"].apply(normalize_date)

# 変換結果を表示
display(df)

print("データ件数:", len(df))
print(
    "変換成功件数:",
    (df["注文日_統一後"] != "").sum()
)
print(
    "未変換件数:",
    (df["注文日_統一後"] == "").sum()
)

今回の検証では、元の日付を残したまま、右端に「注文日_統一後」という列が追加されました。

結果は次のとおりです。

注文番号注文日(元データ)注文日_統一後
A0012026/10/012026-10-01
A0022026-10-022026-10-02
A0032026年10月3日2026-10-03
A0042026.10.042026-10-04
A005202610052026-10-05
A0062026/13/01(空欄)
A007(空欄)(空欄)

画面下部には、次の結果が表示されました。

データ件数: 7
変換成功件数: 5
未変換件数: 2

今回の検証では、5件の日付を正しく統一できました。

一方、不正な日付と空欄については、勝手に別の日付へ修正せず、未変換として残しています。

日付変換コードのポイント

今回使用したコードの中心となるのは、datetime.strptime() と strftime() です。

datetime.strptime()で元の日付を読み取る

例えば、

datetime.strptime("2026/10/01", "%Y/%m/%d")

は、スラッシュ区切りの日付を読み取る処理です。

今回のコードでは、5種類の形式を順番に試しています。

strftime()で出力形式を統一する

日付を正しく読み取れたら、

parsed_date.strftime("%Y-%m-%d")

で、すべて同じ形式に変換します。

つまり、

元の文字列を読み取る → strptime()
統一後の形式で出力する → strftime()

という役割です。

空欄と不正な日付は変換しない

今回のコードでは、変換できない日付に対して空文字を返します。

例えば、

2026/13/01

のような日付は、13月が存在しないため正常に変換できません。

また、注文日が空欄の場合も、変換後の列には空欄を残します。

元データを確認せずに日付を推測して修正しないようにするためです。

変換できなかった日付だけを自動抽出する

日付を統一したあと、変換できなかったデータだけを確認します。

今回は、変換後の「注文日_統一後」が空欄になっている行を抽出します。

さらに、確認理由を表示する列も追加しました。

# 変換できなかった行だけを抽出
error_df = df[
    df["注文日_統一後"] == ""
].copy()

# 未変換の原因を分類する関数
def check_date_error(value):

    value = str(value).strip()

    if not value:
        return "日付が未入力"

    return "形式不一致・不正な日付"

# 確認用の列を追加
error_df["確認理由"] = error_df["注文日"].apply(
    check_date_error
)

print("確認が必要なデータ件数:", len(error_df))

display(error_df)

今回の検証では、次の2件が抽出されました。

注文番号注文日確認理由
A0062026/13/01形式不一致・不正な日付
A007(空欄)日付が未入力

実行結果には、

確認が必要なデータ件数: 2

と表示されました。

今回のコードでは、不正な日付なのか、対応していない日付形式なのかまでは細分化していません。

空欄は「日付が未入力」、それ以外で変換できなかったものは「形式不一致・不正な日付」としてまとめています。

変換結果と確認対象を別々のCSVに保存する

次に、日付を統一した全データと、確認が必要なデータをそれぞれ別のCSVへ保存します。

今回は次の2ファイルを作成します。

ファイル名保存する内容
date_normalized.csv元の日付・統一後の日付を含む全7件
date_errors.csv確認が必要な2件と確認理由

使用したコードはこちらです。

# 全データをCSVとして保存
df.to_csv(
    "date_normalized.csv",
    index=False,
    encoding="utf-8-sig"
)

# 確認が必要なデータだけを別CSVに保存
error_df.to_csv(
    "date_errors.csv",
    index=False,
    encoding="utf-8-sig"
)

print("CSVファイルを2種類作成しました")
print("全データ:", "date_normalized.csv", len(df), "件")
print("確認対象:", "date_errors.csv", len(error_df), "件")

今回の実行結果は、次のとおりです。

CSVファイルを2種類作成しました
全データ: date_normalized.csv 7 件
確認対象: date_errors.csv 2 件

Google Colabの左側ファイル一覧にも、

date_format_test.csv
date_normalized.csv
date_errors.csv

の3ファイルが表示されました。

今回のように確認対象だけを別ファイルへ出力しておけば、全データを上から下まで確認する必要がありません。

保存したCSVを再読み込みして内容を確認する

最後に、保存した2つのCSVをもう一度読み込み、保存前後でデータの内容が変わっていないか確認します。

今回は、注文番号や日付を文字列として保持するため、dtype=str を指定しています。

また、空欄が自動的に欠損値へ置き換わるのを避けるため、keep_default_na=False も指定します。

今回使用した確認コード

import pandas as pd

# 保存した2つのCSVを再読み込み
normalized_check = pd.read_csv(
    "date_normalized.csv",
    encoding="utf-8-sig",
    dtype=str,
    keep_default_na=False
)

errors_check = pd.read_csv(
    "date_errors.csv",
    encoding="utf-8-sig",
    dtype=str,
    keep_default_na=False
)

# 比較前に行番号を0から振り直す
normalized_match = (
    df.reset_index(drop=True)
    .equals(normalized_check.reset_index(drop=True))
)

errors_match = (
    error_df.reset_index(drop=True)
    .equals(errors_check.reset_index(drop=True))
)

print("【全データ】")
print("保存前後の一致:", normalized_match)
print("データ件数:", len(normalized_check))

print("\n【確認対象データ】")
print("保存前後の一致:", errors_match)
print("データ件数:", len(errors_check))

if normalized_match and errors_match:
    print("\n成功:2つのCSVは保存前後で一致しています")
else:
    print("\n注意:保存前後のデータに違いがあります")

今回の最終的な実行結果は、次のとおりです。

【全データ】
保存前後の一致: True
データ件数: 7

【確認対象データ】
保存前後の一致: True
データ件数: 2

成功:2つのCSVは保存前後で一致しています

これで、全データ7件・確認対象2件の両方について、保存前後の内容が一致していることを確認できました。

保存後の比較でFalseになった場合は?

今回の検証では、最初の比較時に、確認対象データだけ一致判定が False になりました。

原因は、データの内容ではなく、行番号(インデックス)の違いでした。

CSVへ保存すると行番号が振り直される

STEP 3では、元データ7件からA006・A007の2件だけを抽出しました。

このとき、抽出後の error_df には、元データの行番号が引き継がれます。

データ行番号
保存前のerror_df5、6
CSV保存後に再読み込みしたerrors_check0、1

DataFrame.equals() はデータの値だけでなく、行番号も含めて比較します。

そのため、データ内容が同じでも、行番号が異なると False になる場合があります。

reset_index(drop=True)で行番号を揃える

今回は、比較前に行番号を振り直すことで解決しました。

errors_match = (
    error_df.reset_index(drop=True)
    .equals(errors_check.reset_index(drop=True))
)

reset_index(drop=True) は、行番号を0から振り直す処理です。

修正後は、確認対象データも True となり、保存前後で内容が一致していることを確認できました。

CSVを抽出・保存・再読み込みしたあとに比較する場合は、行番号の違いにも注意しましょう。

元CSVを上書きせず、別ファイルで保存する理由

今回は、元のCSVである、

date_format_test.csv

を上書きせず、

date_normalized.csv
date_errors.csv

という別ファイルを作成しています。

これは、変換前の日付データを残しておくためです。

例えば、

2026/13/01

という入力ミスがあった場合、元データが残っていれば、取引先や入力担当者に正しい日付を確認できます。

実務でも、

元データ
↓
日付を統一
↓
変換できなかったデータを抽出
↓
別々のCSVとして保存
↓
確認が必要な行だけ修正

という流れにしておくと安全です。

自分のCSVで変更する場所

今回のコードを自分のCSVファイルで使う場合、主に変更するのは次の部分です。

今回の設定自分のCSVでは
date_format_test.csv実際に変換したいCSVファイル名
"注文日"日付が入力されている列名
"注文日_統一後"変換後の日付を保存する列名
date_formats対応したい元の日付形式
date_normalized.csv全データの保存ファイル名
date_errors.csv確認対象の保存ファイル名

例えば、元CSVの日付列が「売上日」なら、

df["売上日_統一後"] = df["売上日"].apply(normalize_date)

のように変更できます。

ただし、変更した列名は、未変換データの抽出コードでも同じ名称へ変更する必要があります。

また、実際のCSVを使う場合は、Google Colabの左側ファイル一覧に対象ファイルをアップロードしてから実行してください。

今回の方法で変換できない日付もある

今回のコードは、あらかじめ指定した5種類の日付形式を対象としています。

そのため、例えば、

10/01/2026
令和8年10月1日
2026年10月1日 15:30

のような日付・日時は、そのままでは変換対象になりません。

これらを扱う場合は、対応する日付形式を追加するなど、別途調整が必要です。

また、

2026/13/01
2026/02/30

のような存在しない日付は、形式が似ていても正常な日付として変換できません。

日付の形式を統一する処理と、入力ミスを正しい日付へ修正する処理は別物です。

今回は、判断できないデータを勝手に修正せず、人が確認できるように抽出する方法を採用しています。

どんな仕事で使える?

今回の方法は、注文履歴以外にも使えます。

  • 複数の取引先から受け取った売上CSVの日付統一
  • システム移行前のデータ整形
  • 顧客リストの登録日・更新日の統一
  • 月次集計前の日付形式の整理
  • 納期管理表の日付表記の統一
  • 日付の入力漏れや不正値の確認
  • 新旧CSVを比較する前のデータ整形

特に、

複数の人・複数のシステムから集めたCSVを、1つにまとめて集計する

ような仕事では、日付表記を先に統一しておくと、後工程での扱いが楽になります。

以前紹介した表記ゆれ整形との違い

以前の記事では、商品コードや会社名などの表記ゆれを整える方法を紹介しました。

今回もデータを統一するという点では共通していますが、対象が異なります。

項目表記ゆれ整形今回の日付統一
対象商品コード・会社名など注文日・売上日など
主な処理空白削除・全角半角・大文字小文字の統一日付形式の判定・変換
確認対象表記が揃っていない文字列変換できない日付・空欄

CSV内の日付以外の文字列も整えたい場合は、以前の表記ゆれ整形記事も参考にしてください。

あわせて読みたい

Excel・CSVの表記ゆれや余分な空白をまとめて整える方法|Google Colab+Python
Excel・CSVの表記ゆれや余分な空白をGoogle ColabとPythonでまとめて整える方法を解説。前後スペース、大文字小文字、全角半角の統一からCSV保存まで実際に検証しました。

まとめ

今回は、Google ColabとPythonを使って、CSVの日付表記をまとめて統一しました。

実際に確認したのは、

  • 5種類の日付表記を YYYY-MM-DD 形式へ統一
  • 元の日付を残したまま変換後の列を追加
  • 全7件のうち5件の変換に成功
  • 変換できなかった2件を抽出
  • 確認理由を表示する列を追加
  • 全データと確認対象を別々のCSVへ保存
  • 保存後に再読み込みし、両方のデータ一致を確認

です。

今回のように、日付を統一する処理と、変換できなかったデータを抽出する処理を組み合わせると、修正が必要なデータだけを効率よく確認できます。

また、元の日付を残しておけば、後から変換結果を確認したり、入力元に問い合わせたりする際にも役立ちます。

毎回Excelで日付を1件ずつ修正したり、不正な日付を探したりしているなら、この方法で日付の変換とチェックを自動化して、面倒なデータ整理作業を減らしていきましょう!

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