pandasのto_datetimeでValueErrorが出るときの原因と対処法【実務で踏んだ3パターン】

「pandasで日付のデータ処理をしようとしたとします。なぜかいつもValueErrorが出てしまう…」このように感じたことはありませんか?私は会社で経理・総務の仕事をしています。日々の業務でExcelファイルを扱う機会が多いです。以前から「この日付集計を自動化できたら」と強く思っていました。もっと楽になるのにと感じていたのです。そこでPythonとpandasを使いました。日付データをきれいに整えようと奮闘していたのです。

しかし、いざ日付列を変換しようとしました。pd.to_datetime()を使ってみたのです。すると、毎回のように謎のエラーに阻まれてしまいます。メッセージを読んでもさっぱり分かりません。専門用語ばかりで試行錯誤の連続でした。しまいにはerrors=’coerce’という設定を見つけました。「これでエラーは消えた!」と喜んだのも束の間です。集計結果がめちゃくちゃになってしまいました。上司に説明するのに胃が痛くなる思いをしたこともあります。

この記事では、私が実際に業務で経験したエラーについてお話しします。to_datetimeのValueErrorの原因と具体的な対処法です。これらを3つのパターンに分けてご紹介します。非エンジニアの皆さんでも安心して読み進められるように工夫しました。分かりやすい言葉で解説していきます。ぜひ一緒にエラーを解決していきましょう。

to_datetimeエラー、まず確認すべきこと

pandasのto_datetimeを使って日付データを変換します。その際にValueErrorが発生すると、本当に困ってしまいますよね。私も何度もこのエラーに遭遇しました。そのたびに何が悪いのか途方に暮れていたのです。しかし、いくつかの基本的な確認ポイントを知っておくことが大切です。そうすれば、エラーの原因を特定しやすくなります。まず最初に行うべきは、エラーメッセージをよく読むことです。そして変換しようとしている日付データの中身を詳しく見てみましょう。

ValueErrorの解読とデータ確認

Pythonのトレースバックに表示されるメッセージには注目してください。ValueErrorのメッセージは、多くの情報を含んでいます。例えば、次のようなメッセージが出たとします。日付とフォーマットが合わないという内容です。「does not match format」といった文言が含まれます。これは、日付の文字列と指定した形式が一致していない証拠です。データに余計なスペースがあるのかもしれません。あるいはフォーマットの指定が間違っているかもしれないと推測できます。

次に大切なのが、変換対象のデータ状態の確認です。どのような状態になっているかを具体的に確認しましょう。Excelから読み込んだデータやCSVファイルの場合に注意が必要です。見た目では問題なさそうに見えることが多いです。しかし、実は余計なスペースや記号が混じっていることがあります。

日本語インターフェースのJupyter Notebookの出力画面。ValueE

to_datetimeのformat引数、…

to_datetimeでValueErrorが発生するよくある原因があります。最も多い原因の一つが、format引数の指定ミスです。日付の文字列が「2023/01/15」のようにスラッシュ区切りだとします。それなのに、formatでハイフン区切りを指定してはいけません。そうしてしまうと、Pythonはエラーを返してしまいます。「この文字列は、あなたが指定した形式とは違うよ」というわけです。私もこのミスで何度も時間を無駄にしました。

例えば、Excelから出力されたCSVファイルで起きた事例です。日付列が「YYYY/MM/DD」形式になっていました。それなのに、うっかり以前使ったコードをコピペしてしまったのです。

私は過去に、このformat指定のミスで月に5回以上スクリプトを止めてしまったことがあります。

海外データの日付形式エラー解決

以前、海外支社から送られてきた売上データがありました。その日付が「DD/MM/YYYY」形式だったのです。私は日本で一般的な形式だと思い込んでいました。そのままformat=’%Y/%m/%d’で変換しようとしたのです。結果として、盛大にValueErrorを出してしまいました。エラーメッセージの中に解決のヒントを見つけました。dayfirst=Trueを指定するという内容です。それで解決できたときは本当に安心したものです。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

to_datetimeエラーの落とし穴:見えない文字列…

to_datetimeでエラーが出る別の原因もあります。目に見えにくい「文字列のノイズ」が挙げられます。日付の文字列に、余計なスペースが混入しているケースです。これは前後や途中の半角・全角スペースを問いません。また、日付として認識されない記号が紛れ込むこともあります。全角文字が入っていると、うまく日付として認識できません。結果として、エラーを吐き出してしまいます。私もこのパターンで、何度か頭を抱えた経験があります。

例えば、Excelで日付を入力する際によく起きるのです。うっかりスペースキーを押してしまうことがあるでしょう。コピー&ペーストの際に余計な文字まで取り込んでしまうこともあります。特に全角スペースは半角スペースと見た目がほとんど同じです。そのため、目視での発見が非常に困難になります。また、「2023年1月15日」のように漢字が入っている場合も注意です。明示的に指定しない限りValueErrorの原因となります。

ノイズ除去と文字列操作メソッドの活用

このようなノイズを除去するためには、文字列操作が有効です。str.strip()やstr.replace()といったメソッドが非常に役立ちます。

全角スペースの混入で詰まったとき、私は3時間以上原因を探し続けたことがあります。データ量が多かったため、目視では全く特定できなかったのです。

日本語インターフェースのJupyter Notebookで、str.strip(

Excel日付シリアル値のpandasでの正確な変換

Excelファイルを読み込んだ際にも問題が起きます。日付の列がdatetime型にならないことがあります。ただの数値として扱われてしまうのです。そのまま変換しようとして、エラーが発生します。これは、Excelが内部で日付を「シリアル値」で管理しているためです。Excelのシリアル値は、1900年1月1日を「1」とします。そこから何日経過したかを示す数値なのです。

例えば、Excelで「2023/01/15」と表示されているセルがあります。これをCSVで保存せずに直接pandasで読み込んでみましょう。すると、データフレーム上では「44940」のような数値になります。この数値をそのまま渡しても失敗します。Pythonはそれが日付のシリアル値であるとは認識できません。そのため、エラーを返してしまうのです。

Excelシリアル値の単位と基準日設定

この問題には、二つの引数を組み合わせて対応します。二つの引数を組み合わせるのが正解です。unit=’D’と指定することで、入力された数値の単位を伝えます。これは「日」単位であることを意味します。そして、origin=’1899-12-30’と指定しましょう。これでExcelのシリアル値の基準日を設定できます。多くのExcelバージョンで1900年1月1日を1とします。そのため、原点となる0は1899年12月30日となるのです。

日本語インターフェースのJupyter Notebookで、Excelシリアル値

errors=’coerce’の落とし穴

エラーが出たときの心理を考えてみます。「エラーを無視して変換を進めたい」という気持ちになることはよくあります。そんな時に目にするのが、errors=’coerce’というオプションです。これを指定すると、変換できない文字列があってもエラーが出ません。その部分をNaTに置き換えてくれます。NaTとは無効な日付を示す特殊な値です。一見するとエラーが解決したように見えます。しかし、実はここに大きな落とし穴が潜んでいるのです。

私も「これでエラーが出ない!」と喜んで使いました。指定したまま自動化スクリプトを実行したのです。その結果、集計されたデータを見て驚きました。なぜか一部の月の数字が大きく狂っていたのです。原因を調べてみると、変換できなかった日付がNaTになっていました。そのNaTが混ざった状態で集計処理が行われたのです。

NaTで売上ゼロ、冷や汗の集計漏れ

errors=’coerce’でエラーを黙らせたことがあります。そのまま月別集計の自動化スクリプトを流しました。すると特定の月の売上がゼロと表示されてしまったのです。上司から「これ、おかしくない?」と指摘を受けました。原因を調べたら、その月のデータの日付が全てNaTになっていたのです。集計から完全に漏れていたことが判明しました。冷や汗をかきながら手作業でデータを修正する羽目になりました。上司には平謝りです。あの胃が重くなるような感覚は今でも忘れられません。

日本語インターフェースのJupyter Notebookの出力画面。errors

日付型変換の確認と活用

日付データを変換したつもりでも油断禁物です。本当にdatetime型になっているのかどうか確認が必要です。この確認ステップを省いてしまうと、後で思わぬエラーに詰まることがあります。見た目上は日付のように見えても、内部的にはまだ文字列のままかもしれません。あるいはNaTが混ざっているのに気づかないこともあります。計算がうまくいかないと、また原因を探す手間が増えるでしょう。

日付データ型の確認と.dtアクセサ

変換が正しく行われたかどうかを確認する簡単な方法があります。データフレームのdtypes属性を使うことです。あるいは、特定の列のdtype属性を使ってもよいでしょう。df.dtypesを実行すると、全列のデータ型が一覧で表示されます。もし日付の列がdatetime64[ns]と表示されていれば成功です。正しく変換されています。もしobjectと表示されている場合は失敗の可能性が高いです。まだ文字列のままであると考えられます。特定の列だけを確認したい場合は、次のように指定します。df[‘日付列’].dtypeのように書くのです。

そうすると、その列のデータ型だけを確認できるというわけです。

さらに、便利な機能があります。変換されていれば、.dtアクセサが使えます。これを使えば、年、月、日などの要素を簡単に取り出せるのです。例えば、df[‘日付列’].dt.yearを実行して年だけを抽出します。

日本語インターフェースのJupyter Notebookの出力画面。df.dty

to_datetimeエラー、3つの原因と解決策

ここまで、to_datetimeのValueErrorが出る原因と対処法について解説してきました。非エンジニアだった私は、Pythonを使い始めた当初、このエラーに何度も詰まったものです。しかし経験を積むうちに、原因は大きく3パターンに絞れると気づきました。「指定ミス」「文字列のノイズ混入」などです。それに加えて「Excelシリアル値の問題」に集約されます。

これらの問題は、焦らずに一つずつデータの中身を確認すれば解決できます。適切な前処理や指定を行うことで、ほとんど対処可能です。特にerrors=’coerce’は、エラーが消えた安心感で見落としがちです。私も一度そのパターンにはまりました。データを集計した後で初めて「あれ、おかしい」と気づくパターンが多いので、変換後のNaT確認はクセにしておくのが安全だと思っています。

以前はerrors=’coerce’で黙らせたまま集計して、上司に指摘された経験があります。おかげでこのクセだけは早めに直せました。

to_datetimeエラー克服3パターン

私自身、この3パターンを押さえてからは、to_datetimeでつまずくことがほとんどなくなりました。エラーメッセージを見ても焦らずに「formatかな、ノイズかな、シリアル値かな」と確認できるようになったのです。もし同じエラーで詰まっている方がいたら、この記事が少しでも役に立てば嬉しいです。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Python・pandas関連書籍を、手元で見返せる形にしておきたい場合

pandasのエラー対応は、似た症状を何度も見返すことが多いです。データ前処理や型変換を手元で確認できる本を1冊置いておくと、調べ直しの時間を減らしやすいです。

Python・pandas関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する