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

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

「シリアル値って何？とうもろこしで出来てる的な何か？」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/c1c8ba24-78f0-4a0b-bf7a-1378addfe045.png)

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

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

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

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

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

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

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

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

「2025年3月8日」だと「45724」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/34b67180-3a67-43b5-baef-a85e2425ed19.png)

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

ちなみに、1900年といえばこんなイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/e4a43be7-1d3b-4a3b-91f9-5b0d704c744d.png)

鬼〇の刃の頃でしょうか？（適当）

## 「何日経ったか」とは

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

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

「**経っている**」って何ですか？

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

**0日目と考えるのか**

**1日目と考えるのか**

どっちなんだい？

ということです。

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

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

## 実際に見てみる
Excelで、ここ1週間ほどの日付とそのシリアル値を出してみました。
（ちなみに、Excelのシリアル値は日付をコピペして書式変換的なドロップダウンで「数値」を選べば出ます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/5c4b7fd0-44fe-4d78-b8da-e05260fbb946.png)

ちなみに、ExcelのDATEDIF関数を使って、
1900年1月1日からの日数を出してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/9c1ef7de-3315-4496-b10f-af4a3e51d5ae.png)

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

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

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

で、できたのがこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/844b3c39-3553-4c85-94f2-f7ed0479a5ea.png)

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

先ほどまでの話だと、
 - Excel→1900/1/1が0
 - Tableau→1900/1/1が1

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

## なぜ2日ずれるのか？

その理由は[Salesforceヘルプ](https://help.salesforce.com/s/articleView?id=001460188&type=1)に書いてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/57e42f64-cef4-493c-830e-512d0a75fa48.png)

そう、1900/2/29！！
こんな日付は存在しません！！
chatGPTじゃ信憑性が下がるので、
Google先生に聞いてみました。（聞き方が雑過ぎる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/76525618-d70d-4fb6-b58d-2d6c5f583dd6.png)

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

この逸話はPreppinData勉強会でもりたさん（@hiroakimo_tw
）に教えて頂いたのですが、
[Microsoft公式](https://learn.microsoft.com/ja-jp/office/troubleshoot/excel/wrongly-assumes-1900-is-leap-year)にも包み隠さずちゃんと書いてますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/eb36ca5b-4a49-49dd-a838-211e83fb36a0.png)

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

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

で、Tableauの話に戻りますが、
Tableauは「ふ...Excelのバグなんて、修正してやるよ」って感じで、
1900年2月29日は存在しないことにしてます。
本当にそうか見てみたいので、先ほどのExcelに「1900年2月29日」を追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/2586dba0-4e3d-4af4-9fa1-2de82f7da47c.png)
Excelでは確かに存在してることになってますね。

で、この日付を追加したので、Tableauで更新をかけてやると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/7eaab34d-f54b-453b-8cbf-c2ba62faed55.png)
NULLになりました。
Excelで作ったシリアル値の数値は「60」になってるので、
私が入力し忘れたとかではなさそうです。
念のため前後の日付も入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/e567cd9a-bbf4-486b-960c-2c9dc0884688.png)

これをTableauで見ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/a648ec72-22e5-4325-b2c6-fc7a2b5c6219.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動画](https://youtu.be/4gD9RpUUFmo?si=4GH_AXXoH7DCAOKC)の06:00~15:00あたりで解説しているので興味あったらご覧ください。

要は、
**Prepでシリアル値を日付にする場合、INTしてDATEにしたらいけるけど、-2する必要があるよ！**
とのことです。
ちなみにPrepだと日付を持たない時刻型にした場合「1899-12-30」が基準になるという謎現象もあるのですが、その辺はまたおいおい記事にできればなと思います。


## そもそもなんで1900-01-01やねん
なんで基準日が1900/1/1なのか気になったけど調べるのめんどくさくなってきたのでchatGPTに聞きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/c7e0ce6a-836a-4d12-80fd-c754d134577a.png)

他にも出てたけど、要は「Lotus1-2-3がそうだから」という。
ちなみに衝撃の事実が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/595f3948-af3b-408b-b159-be522f0f90ad.png)

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

堂々巡りなので次のプロンプトを投げました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/1fead094-231f-4753-919f-bfb7ac434e50.png)

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

## 補足（TableauのDATEDIFF）
ちなみに、TableauのDATEDIFF関数を使って1900年1月1日との差分を出すと、こうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3666377/667dd2cc-fd97-44e4-bda8-874e47804600.png)

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



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

Rieko