2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TabelauとExcelにおけるシリアル値の違いを探ってみた

Posted at

こんにちは!
みんな、シリアル値って知ってるかい?
Qiita記事読んでる人なら正直誰でも知ってると思いますが、
私の記事は「社会人1年目でもわかる」をmottoにしてますので、

「シリアル値って何?とうもろこしで出来てる的な何か?」
image.png

といった方にもわかるように書いていきたいと思います。
それでは行ってみよう!

シリアル値とは

私が色々紡ぎだすより早いので、chatGPTに柴犬風に説明してもらいました。
(もう記事自体chatGPTで書けよ...とは言わないで😂)

🐕「ワン!シリアル値っていうのは、コンピュータの中で日付や時間を数字で表す方法なんだワン!」

🐾「例えば、お散歩に行った日をコンピュータに覚えさせるとするワン。『2025年3月8日』ってそのまま書くんじゃなくて、『45268』みたいな数字になるワン!」(※Excelのシリアル値の場合)

🐶「この数字は、基準となる日(例えばExcelだと1900年1月1日)から何日経ったかを表してるワン。だから、数字が大きくなるほど、日付が後になるワン!」

🍖「でも、シリアル値って聞くとオヤツの『シリアル』を思い浮かべるのは、仕方ないワンね…じゅるり🤤」

こんな感じでイメージできたワン?🐾

なんか言ってますが、要するに
基準となる日(例えばExcelだと1900年1月1日)から何日経ったかを表してるワン
まじでこれだけの話。

「2025年3月8日」だと「45724」になります。
image.png

「1900年1月1日」から「4万5,724日」経っていることになります。

ちなみに、1900年といえばこんなイメージ
image.png

鬼〇の刃の頃でしょうか?(適当)

「何日経ったか」とは

鋭い方からここで違和感をもったはず。

chatGPT「何日経ったかを表している」
私「4万5,724日経っていることになります。」

経っている」って何ですか?

そう、「1900年1月1日」が

0日目と考えるのか

1日目と考えるのか

どっちなんだい?

ということです。

Excelの場合、答えは1日目です。

ところがなんと、Tableauは0日目なのです!!

実際に見てみる

Excelで、ここ1週間ほどの日付とそのシリアル値を出してみました。
(ちなみに、Excelのシリアル値は日付をコピペして書式変換的なドロップダウンで「数値」を選べば出ます)
image.png

ちなみに、ExcelのDATEDIF関数を使って、
1900年1月1日からの日数を出してみました。
image.png

1日ずれとるやないかい!
そう、DATEDIFで計算すると
1900年1月1日が「0日目」になるけど、
Excelの場合1900年1月1日を「1日目」と考えるので、
DATEDIFよりシリアル値が1日多くなります。

では、Tableauだとどうなのでしょうか?
上記Excelを読み込ませて、以下のステップでシリアル値フィールドを作ります

  1. 日付フィールドを複製
  2. 複製したフィールドを「数値(整数)」にする

で、できたのがこちら

image.png

今度は2日ずれてやがります。
シリアル値の在り方を世界基準で統一して欲しいですよね。

先ほどまでの話だと、

  • Excel→1900/1/1が0
  • Tableau→1900/1/1が1

なので、1日しかずれないはず。

なぜ2日ずれるのか?

その理由はSalesforceヘルプに書いてました。
image.png

そう、1900/2/29!!
こんな日付は存在しません!!
chatGPTじゃ信憑性が下がるので、
Google先生に聞いてみました。(聞き方が雑過ぎる)
image.png

出るわ出るわ...記事読まなくても
1900年2月29日など存在しないのに、Excelではあることになってる!
というのがわかります。

この逸話はPreppinData勉強会でもりたさん(@hiroakimo_tw
)に教えて頂いたのですが、
Microsoft公式にも包み隠さずちゃんと書いてますね。
image.png

色々書いてますが、要は

  • Lotus1-2-3がちょっと間違えたけど、そのおかげで処理しやすくなったんやで!
  • ExcelもLotus1-2-3との互換性の為に、そのまま採用したやで!
  • バグ(とは言ってない)修正もできるけど、色んな問題出てくるから、当面しないやで!

とのことでした。現場からは以上です。
(Lotus1-2-3というのを初めて知りましたが、Excelができる前の世界って考えると、ワクワクしますね)

で、Tableauの話に戻りますが、
Tableauは「ふ...Excelのバグなんて、修正してやるよ」って感じで、
1900年2月29日は存在しないことにしてます。
本当にそうか見てみたいので、先ほどのExcelに「1900年2月29日」を追加しました。
image.png
Excelでは確かに存在してることになってますね。

で、この日付を追加したので、Tableauで更新をかけてやると、
image.png
NULLになりました。
Excelで作ったシリアル値の数値は「60」になってるので、
私が入力し忘れたとかではなさそうです。
念のため前後の日付も入れてみます。

image.png

これをTableauで見ると

image.png

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に聞きました。

image.png

他にも出てたけど、要は「Lotus1-2-3がそうだから」という。
ちなみに衝撃の事実が。
image.png

えぇ...もうわけわからんやん。Windowsでよかった(昔の話ね)

堂々巡りなので次のプロンプトを投げました。
image.png

他にも出てきたけど、ここまでいくと「1900-01-01の原点」を探らなきゃいけなくなるので、考えるのをやめました。誰か調べたら教えてください。

補足(TableauのDATEDIFF)

ちなみに、TableauのDATEDIFF関数を使って1900年1月1日との差分を出すと、こうなりました。
image.png

Tableauで出したシリアル値と、TableauのDATEDIFFの値は一致しています。
DATEDIFFと一致させるために、TableauがあえてExcelと違うこと承知で1900年1月1日を0日にしたのかもしれません。
ユーザーを1番に考えているTableauっぽいですね!

おわりに

PreppinData勉強会で知ったのでいつかまとめたいな~と思っていたことを、
ようやく記事にできて嬉しいです。
PreppinDataは毎回すごく学びがあるので、
できれば毎週ブログ書きたいのですが、
他に色々やることg多すぎて難しいという。
それでも2025年はアウトプットの1年にしたいです!
それではまた!

Rieko

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?