はじめに
Pythonでcsvファイルにあるデータを解析している時にエラーが発生。
pandasが非常に便利なのでこれを使ってデータのソートや比較を行っている時でした。
今回はその時に発生したエラーとその原因と対処方法についてです。
サンプルプログラムで例も表示しているのでわかりやすいかと思います。
エラー&原因と対処方法
エラー
まず発生したエラーメッセージですが、
TypeError: Invalid comparison between dtype=datetime64[ns] and str
というものでした。
これを訳すと
「型のエラー:dtype=datetime64[ns]とstrの間での無効な比較」
と言っています。
Pythonでは、異なる型のデータ同士は直接比較できないためエラーが発生しています。
サンプルプログラム
次は実際にエラーが発生するソースです。
import pandas as pd
df = pd.DataFrame({'date': pd.date_range(start='1/1/2020', periods=5)})
mask = df['date'] < 'not a date'
これを実行すると
raise TypeError(f"Invalid comparison between dtype={left.dtype} and {typ}")
TypeError: Invalid comparison between dtype=datetime64[ns] and str
というようにエラーメッセージが表示されます。
上記のコードでは、日付や時間を表す datetime64
型のデータと、文字列型(str
)のデータを直接比較(4行目)しようとした為発生しました。
ソースコードを次の様に直すとエラーは表示されなくなります。
import pandas as pd
df = pd.DataFrame({'date': pd.date_range(start='1/1/2020', periods=5)})
mask = df['date'] < '1/3/2020'
上記の修正後のコードでは、文字列のフォーマットを日付の型(4行目)にしています。
pandasでは、文字列を日付として解釈できる場合、自動的に変換して比較を行ってくれているのでエラーが発生しません。
さいごに
今回はPythonで異なる型で比較してエラーが出るケースでした。
日付のデータというのはソートや比較でよく使うので特に注意が必要かもしれません。
データの中身によっては日付のデータがなかったり、フォーマットが一致しないものが入っている事があるのでこうした比較を行う時には注意が必要ですね。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。