「同じ日付なのに、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件のデータを使用します。
| 注文番号 | 注文日 | 商品名 | 売上 |
|---|---|---|---|
| A001 | 2026/10/01 | りんご | 1200 |
| A002 | 2026-10-02 | みかん | 1500 |
| A003 | 2026年10月3日 | ぶどう | 2000 |
| A004 | 2026.10.04 | もも | 1800 |
| A005 | 20261005 | いちご | 2200 |
| A006 | 2026/13/01 | なし | 1600 |
| A007 | (空欄) | メロン | 2500 |
このうち、A001〜A005は日付の変換対象です。
A006の「2026/13/01」は13月が存在しないため、正しい日付に変換できません。また、A007は注文日が空欄です。
今回はこれらを含む7件を、
date_format_test.csv
というファイル名で使用します。
Google Colabで検証用CSVを作成する
まず、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()
)
今回の検証では、元の日付を残したまま、右端に「注文日_統一後」という列が追加されました。
結果は次のとおりです。
| 注文番号 | 注文日(元データ) | 注文日_統一後 |
|---|---|---|
| A001 | 2026/10/01 | 2026-10-01 |
| A002 | 2026-10-02 | 2026-10-02 |
| A003 | 2026年10月3日 | 2026-10-03 |
| A004 | 2026.10.04 | 2026-10-04 |
| A005 | 20261005 | 2026-10-05 |
| A006 | 2026/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件が抽出されました。
| 注文番号 | 注文日 | 確認理由 |
|---|---|---|
| A006 | 2026/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_df | 5、6 |
| CSV保存後に再読み込みしたerrors_check | 0、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内の日付以外の文字列も整えたい場合は、以前の表記ゆれ整形記事も参考にしてください。
あわせて読みたい

まとめ
今回は、Google ColabとPythonを使って、CSVの日付表記をまとめて統一しました。
実際に確認したのは、
- 5種類の日付表記を
YYYY-MM-DD形式へ統一 - 元の日付を残したまま変換後の列を追加
- 全7件のうち5件の変換に成功
- 変換できなかった2件を抽出
- 確認理由を表示する列を追加
- 全データと確認対象を別々のCSVへ保存
- 保存後に再読み込みし、両方のデータ一致を確認
です。
今回のように、日付を統一する処理と、変換できなかったデータを抽出する処理を組み合わせると、修正が必要なデータだけを効率よく確認できます。
また、元の日付を残しておけば、後から変換結果を確認したり、入力元に問い合わせたりする際にも役立ちます。
毎回Excelで日付を1件ずつ修正したり、不正な日付を探したりしているなら、この方法で日付の変換とチェックを自動化して、面倒なデータ整理作業を減らしていきましょう!


