はじめに
今回はPythonの日付フォーマットに関するエラーです。
日付のフォーマットの指定で起きたエラーとその時の対処法について、またエラーが発生するコードとそれを修正したものを例として載せているので参考になればと思います。
エラーの原因と対処法
エラー
まず発生したエラーですが、
ValueError: time data - doesn't match format specified
というものです。
日本語で訳すと
「ValueError: 時間のデータが指定されたフォーマットと一致しません」
となります
原因とサンプルソース
原因
エラーから分かる様に原因はフォーマットの変換ミスによるものです。
このエラーは、ある時間の文字列を datetime
オブジェクトや time
オブジェクトに変換しようとしたときに、その文字列が指定したフォーマットに一致しない場合に発生します。
エラーが発生するソースコード
次がエラーが発生するソースコードです。
例では日付のデータをpandasで保持しています。
import pandas as pd
# ダミーデータを作成
data = {
'日付': ['07/06/2023'], # この日付のフォーマットは'%d/%m/%Y'です。
'曜日': ['水'],
'時間': ['10:00'],
}
df = pd.DataFrame(data)
# '日付'カラムをdatetimeオブジェクトに変換(エラーが発生)
df['日付'] = pd.to_datetime(df['日付'], format='%Y/%m/%d') # ここでエラーが発生します
これを実行すると
Traceback (most recent call last):
・
・
(省略)
・
・
result, tz_parsed = tslib.array_to_datetime(
File "pandas/_libs/tslib.pyx", line 381, in pandas._libs.tslib.array_to_datetime
File "pandas/_libs/tslib.pyx", line 530, in pandas._libs.tslib.array_to_datetime
ValueError: time data 07/06/2023 doesn't match format specified
と12行目でエラーになります(pandas
のto_datetime
関数は、渡されるformat
パラメータがデータの実際の日付のフォーマットと一致しない場合、エラーを発生させます。)
修正したソースコード
次が修正したソースコードです。
import pandas as pd
# ダミーデータを作成
data = {
'日付': ['07/06/2023'],
'曜日': ['水'],
'時間': ['10:00'],
}
df = pd.DataFrame(data)
# '日付'カラムをdatetimeオブジェクトに変換
try:
df['日付'] = pd.to_datetime(df['日付'], format='%Y/%m/%d')
except ValueError:
df['日付'] = pd.to_datetime(df['日付'], format='%d/%m/%Y')
例外処理を入れることでエラーを回避しています。
(この例では、日付のフォーマットを%d/%m/%Y
としていますが、変換する際のフォーマットを%Y/%m/%d
としているため、エラーが発生します。修正バージョンでは、まず%Y/%m/%d
のフォーマットで変換を試み、それが失敗した場合は%d/%m/%Y
のフォーマットで変換を試みます。)
Tips
今回のエラーやプログラムに関するTipsです
- 時間の文字列を変換する前に、正確にどのフォーマットで提供されているかを確認
- 一貫した日付/時間のフォーマットを使用してデータを受け取る、または保存するのが望ましい(都度フォーマットを買えない)です
- 不明なフォーマットの日付/時間文字列を受け取る場合は、例外処理を使用して適切なエラーメッセージを表示することを検討する
このエラーは、日付や時間のフォーマットに関するミスマッチがある場合、特に外部のソースからのデータを扱っているときや、異なるフォーマットの日付や時間を頻繁に取り扱っている場合に発生しやすいので共通のルールなどを決めておくのも良いかと思います。
さいごに
今回はpythonでの日付の変換ミスによって発生するエラーについてでした。
フォーマットミスはよく起こるので例の様に例外処理を入れるのが良いかと思います。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。