こんにちは。ざわかける!のざわ(@zw_kakeru)です。
pandasからMySQLを使ってデータベースにアクセスする際に、DATE型の取り出しで少しハマったのでメモしておきます。
起こったこと
pandasからMySQLを使ってDBにアクセスを試みます。
select IP, _DATE from SCORE_TABLE;
これの実行結果は次のようになりました。
きちんとデータが取れていますね。
何の問題もありません。
テーブルの調査をするうちに、_DATEカラム(DATE型)に値が入っていないデータが存在することが分かりました。
そのようなデータのみを抽出しようとして下記を実行しました。
select IP, _DATE from SCORE_TABLE
where _DATE is NULL;
すると、
ヒットが0件。何も取り出すことができませんでした。
where句を _DATE = ” や _DATE = NULL などにしてみても、同様に何も取り出せませんでした。
pandasとSQLでデータの扱いが異なっていたりするのかもしれません。
どうすれば_DATEカラムに値が入っていないデータを取り出せるのでしょうか。
やったこと
公式マニュアルを確認します。
上記リンクのMySQLリファレンスにはこのような記述がありました。
MySQL permits you to store a “zero” value of
https://dev.mysql.com/doc/refman/5.6/en/date-and-time-types.html'0000-00-00'
as a “dummy date.” In some cases, this is more convenient than usingNULL
values, and uses less data and index space.
You can also do this using the values'0'
or0
, which are easier to write.
MySQLではダミーの日付として '0000-00-00'
を格納する、とのこと。
このゼロ値を用いることで使用するデータとインデックス空間を削減することができるそうです。
そして、もっと簡単に0や’0’と書くことも可能だそうです。
もしかしてこれが入ってるのかなと思って早速実行してみると、
select IP, _DATE from SCORE_TABLE
where _DATE = '0000-00-00';
いけました!
ちゃんと_DATEカラムに値が入っていないデータのみを取り出すことができています。
MySQL上では0で、pandas上ではNoneという扱いになるみたいですね。
終わりに
こういう小手先すぎる技術は調べても出てこないので書いておきました。
最初から公式ドキュメントを読むクセをつけるとこんなところでハマったりはしないんだろうなあ。
私は現在pandasを触り始めて半年程度ですが、ようやく少し扱えるようになってきたかなという感じです。
が、まだまだデータを手足のように変形して出力するレベルには程遠いですね。
精進します。
ちなみに、これってMySQLでNoneでも取れたりしないかなと思って試してみましたが、
select IP, _DATE from SCORE_TABLE
where _DATE = 'None';
だめでした。
そりゃそうか。
さらにおまけ。
上では _DATE = ‘0000-00-00’ として抽出しましたが、’0’では何故か抽出できませんでした。謎。
そして0では正しく抽出できました。謎。
扱いが怪しいですがこれ以上は調べるのがめんどくさいのでやりません。