こんにちは!
みんな、シリアル値って知ってるかい?
Qiita記事読んでる人なら正直誰でも知ってると思いますが、
私の記事は「社会人1年目でもわかる」をmottoにしてますので、
といった方にもわかるように書いていきたいと思います。
それでは行ってみよう!
シリアル値とは
私が色々紡ぎだすより早いので、chatGPTに柴犬風に説明してもらいました。
(もう記事自体chatGPTで書けよ...とは言わないで😂)
🐕「ワン!シリアル値っていうのは、コンピュータの中で日付や時間を数字で表す方法なんだワン!」
🐾「例えば、お散歩に行った日をコンピュータに覚えさせるとするワン。『2025年3月8日』ってそのまま書くんじゃなくて、『45268』みたいな数字になるワン!」(※Excelのシリアル値の場合)
🐶「この数字は、基準となる日(例えばExcelだと1900年1月1日)から何日経ったかを表してるワン。だから、数字が大きくなるほど、日付が後になるワン!」
🍖「でも、シリアル値って聞くとオヤツの『シリアル』を思い浮かべるのは、仕方ないワンね…じゅるり🤤」
こんな感じでイメージできたワン?🐾
なんか言ってますが、要するに
「基準となる日(例えばExcelだと1900年1月1日)から何日経ったかを表してるワン」
まじでこれだけの話。
「1900年1月1日」から「4万5,724日」経っていることになります。
鬼〇の刃の頃でしょうか?(適当)
「何日経ったか」とは
鋭い方からここで違和感をもったはず。
chatGPT「何日経ったかを表している」
私「4万5,724日経っていることになります。」
「経っている」って何ですか?
そう、「1900年1月1日」が
0日目と考えるのか
1日目と考えるのか
どっちなんだい?
ということです。
Excelの場合、答えは1日目です。
ところがなんと、Tableauは0日目なのです!!
実際に見てみる
Excelで、ここ1週間ほどの日付とそのシリアル値を出してみました。
(ちなみに、Excelのシリアル値は日付をコピペして書式変換的なドロップダウンで「数値」を選べば出ます)
ちなみに、ExcelのDATEDIF関数を使って、
1900年1月1日からの日数を出してみました。
1日ずれとるやないかい!
そう、DATEDIFで計算すると
1900年1月1日が「0日目」になるけど、
Excelの場合1900年1月1日を「1日目」と考えるので、
DATEDIFよりシリアル値が1日多くなります。
では、Tableauだとどうなのでしょうか?
上記Excelを読み込ませて、以下のステップでシリアル値フィールドを作ります
- 日付フィールドを複製
- 複製したフィールドを「数値(整数)」にする
で、できたのがこちら
今度は2日ずれてやがります。
シリアル値の在り方を世界基準で統一して欲しいですよね。
先ほどまでの話だと、
- Excel→1900/1/1が0
- Tableau→1900/1/1が1
なので、1日しかずれないはず。
なぜ2日ずれるのか?
その理由はSalesforceヘルプに書いてました。
そう、1900/2/29!!
こんな日付は存在しません!!
chatGPTじゃ信憑性が下がるので、
Google先生に聞いてみました。(聞き方が雑過ぎる)
出るわ出るわ...記事読まなくても
「1900年2月29日など存在しないのに、Excelではあることになってる!」
というのがわかります。
この逸話はPreppinData勉強会でもりたさん(@hiroakimo_tw
)に教えて頂いたのですが、
Microsoft公式にも包み隠さずちゃんと書いてますね。
色々書いてますが、要は
- Lotus1-2-3がちょっと間違えたけど、そのおかげで処理しやすくなったんやで!
- ExcelもLotus1-2-3との互換性の為に、そのまま採用したやで!
- バグ(とは言ってない)修正もできるけど、色んな問題出てくるから、当面しないやで!
とのことでした。現場からは以上です。
(Lotus1-2-3というのを初めて知りましたが、Excelができる前の世界って考えると、ワクワクしますね)
で、Tableauの話に戻りますが、
Tableauは「ふ...Excelのバグなんて、修正してやるよ」って感じで、
1900年2月29日は存在しないことにしてます。
本当にそうか見てみたいので、先ほどのExcelに「1900年2月29日」を追加しました。
Excelでは確かに存在してることになってますね。
で、この日付を追加したので、Tableauで更新をかけてやると、
NULLになりました。
Excelで作ったシリアル値の数値は「60」になってるので、
私が入力し忘れたとかではなさそうです。
念のため前後の日付も入れてみます。
これをTableauで見ると
1900年2月29日より後だと、
シリアル値が2日ずれてますね。
これが、「Tableauだとシリアル値がExcelより2日ずれる」の正体です。
Tableauだと
- 1900-02-28→59
- 1900-03-01→60
になるので、ちゃんと1900年2月29日がすっ飛ばされていることがわかりますね。
Tableau Prepだとどうなるのか?
Prepでも同様です。
というのもこの事象を発見したのはPreppinData勉強会です。
そこらへんはこちらのyoutube動画の06:00~15:00あたりで解説しているので興味あったらご覧ください。
要は、
Prepでシリアル値を日付にする場合、INTしてDATEにしたらいけるけど、-2する必要があるよ!
とのことです。
ちなみにPrepだと日付を持たない時刻型にした場合「1899-12-30」が基準になるという謎現象もあるのですが、その辺はまたおいおい記事にできればなと思います。
そもそもなんで1900-01-01やねん
なんで基準日が1900/1/1なのか気になったけど調べるのめんどくさくなってきたのでchatGPTに聞きました。
他にも出てたけど、要は「Lotus1-2-3がそうだから」という。
ちなみに衝撃の事実が。
えぇ...もうわけわからんやん。Windowsでよかった(昔の話ね)
他にも出てきたけど、ここまでいくと「1900-01-01の原点」を探らなきゃいけなくなるので、考えるのをやめました。誰か調べたら教えてください。
補足(TableauのDATEDIFF)
ちなみに、TableauのDATEDIFF関数を使って1900年1月1日との差分を出すと、こうなりました。
Tableauで出したシリアル値と、TableauのDATEDIFFの値は一致しています。
DATEDIFFと一致させるために、TableauがあえてExcelと違うこと承知で1900年1月1日を0日にしたのかもしれません。
ユーザーを1番に考えているTableauっぽいですね!
おわりに
PreppinData勉強会で知ったのでいつかまとめたいな~と思っていたことを、
ようやく記事にできて嬉しいです。
PreppinDataは毎回すごく学びがあるので、
できれば毎週ブログ書きたいのですが、
他に色々やることg多すぎて難しいという。
それでも2025年はアウトプットの1年にしたいです!
それではまた!
Rieko