データ整備の具体的な話・日付と時刻を整理する
データ整備のうちの「整理」の具体的な話を書いてみる
整理しなくてもデータを使うことはできるのだが、時間が余計にかかり、間違いやすくなり、さらにトラブル時にここがおかしくないかどうかを確認する手間が増える。
だからデータを使う際には整備しておくことが重要だ、ということまでは理解してもらえる一方で、何をしているかはあまり語られないために概念だけが先行している印象がある。
そこで「整理」のマニュアルというかガイドみたいのがあってもいいのかも、という話をデータの「整理」で具体的に行っていることで書いた。その例として日付と時刻に関することを書いてみる。
日付・時刻の整理の具体的な話
形式をそろえる
最終的にはdatetime型(あるいはdate型)かtimestamp型のどちらかになると思うが、とにかく統一する。
例として、あるテーブルに日付が「Jan 01 2024」の形式と、別のテーブルでは年・月・日がそれぞれ別のカラムで文字列で入っている場合を考えてみる。
整理している場合としていない場合では、JOINの時に大きく違うことがよくわかる。
-- 整理していない場合
on tbl1.PARSE_DATE('%b %d %Y', 'Jan 01 2024')=tbl2.PARSE_DATE('%Y-%m-%d', CONCAT('2024', '-', LPAD('1', 2, '0'), '-', LPAD('1', 2, '0')))
-- 整理している場合
using(parsed_date)
タイムゾーンをそろえる
混在しているとしたら標準時間と日本時間になることが多いだろう。テーブルによってタイムゾーンに違いがあると集計結果がずれて混乱するので、どこかに統一する。特に事情がなければ日本時間でいい。
UNIXTIMEを変換しておく
ぱっと見てそれがいつなのかわかる人は(多分)いないので、日時に変換しておく。
慣れていない人がUNIXTIMEに遭遇すると、どうするのか調べるだけで時間を取られる。
月・日を作る
月ごとや日ごとの集計は多いのでこの2つは作っておいて損はない。
年、四半期、週なども含めて全部作っても大した手間ではないが、増えすぎると必要なデータを見つけるのに手間がかかるので利用状況に合わせて選択すればよい。
休日フラグまたは区分
検討する条件としては、
土曜、日曜日
国民の祝日
企業や店舗独自の休み
あたり。これも作るのは簡単だがあらゆるパターンのフラグを作るとかえって使いづらいのでできれば1つにしておきたい。
3つ以上区分を作る場合、フラグを増やすか区分値を増やすかは悩ましいところ。
その他特殊な区分
いくらでもあると思うが、ぱっと思い出せたのを書いておく
週番号。相対的に経過週を見たかったので基準を決めてそこから何週目という値
曜日。「月、火」ではソートできず、番号だとわかりずらいので「1_月,2_火」とかで作ったことがある
時間。0~23時のこと
正解は存在しない
一例として日付・時刻について自分がこうしているという話を中心に書いた。やり方はいろいろあるが、これが正解ということはない。
なお、表記を統一する、不要な分ははずす、どこまで品質を高めるかを決める、メタデータを記録するといった日付・時刻に限らず行うことは省いている。
基本的なことはこれで大体書いたつもりでいるが、思い出したら追加しよう。