QuickSightでの日付型データの変換

# はじめに
AWS QuickSightでダッシュボードを構築する際、使用するテーブルの日付に関する部分の型が数値や文字列の場合があります。実務上、数値や文字列を日付型に変換したり、日付型を数値または文字列に変換する必要性が度々発生します。
今回、この記事では、AWS QuickSightでの日付型に纏わる変換方法について紹介します。

# 使用するデータセット
### データセットのダウンロード
今回は、各日付ごとに３種類の商品の販売件数に関するデータ（**sample_sales.csv**）を使用します。使用するデータセットは、以下に格納しています。
[データセット](https://github.com/sawittoo/sample_data/blob/main/quicksight/sample_sales.csv)

### データセットの中身
データセットの各カラムの内容は以下の通りです。
| カラム名 | データ型 | 説明 |
|:-:|:-:|:-:|
| 日付  | 数値 | 商品販売日次（2024/4/4～2024/8/31）　|
| 商品A  | 数値 | 商品Aの販売件数 |
| 商品B  | 数値 | 商品Bの販売件数 |
| 商品C  | 数値 | 商品Cの販売件数 |

# データセットのアップロード
本記事はデータの操作方法に関する説明がメイントピックなので、QuickSight上でのデータのアップロードに関する説明は省略します。
データセットのアップロード、作成方法については、[ユーザーガイド](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/creating-data-sets.html)を参照してください。

# データセットの編集
データをアップロードしたら以下の、データセットの編集画面に移動してください。

![image_for_qiita_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/37ce9b2c-1d2a-18a5-8ae0-c76007e62638.png)

### フィールドから直接型変換してみる
データセットのカラム名の下に各データセットの型が表示されています。
日付のデータも**integer**となっているので、これを**date**に変更したいです。
試しに、既存のフィールド「日付」のデータ型を直接数値型に変更してみます。
フィールドの日付の横の「…」をクリックし、[**データ型の変更**]>[**日付**]を選択してください。 

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/e6b95dc5-42d4-a42f-1bb6-4113683fd224.png">

「**日付形式の編集**」画面が表示されるので、「yyyy/MM/dd」と入力し更新ボタンを押してみてください。すると、同じ画面が表示され日付型に変更することができません。

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/a804d855-c439-ac85-dcaa-5b335ed5c267.png">

### 計算フィールドから変換を行う
計算フィールドを使用するには、編集画面左上の[**追加**]>[**計算フィールドの追加**]を選択します。

![image_for_qiita_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/76ca8dd1-dbc7-30ec-0339-21c1bd27416a.png)

「計算フィールドの追加」の画面は以下の通りです。赤枠部分から、編集したいカラムや関数を選択できます。「名前の追加」の部分はカラム名を記入、その下のエディタに関数を記入して使用します。

![image_for_qiita_1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/ee73f212-476e-a68b-9832-ba5cbaf468ab.png)

ここまでできれば、計算フィールドの準備は完了です。
試しに、商品A、商品Bおよび商品Cの合計販売件数を算出してみます。
シンプルに商品の和をとれば、合計値が算出できます。

```QuickSight:合計値の算出
{商品A} + {商品B} + {商品C}

```

![image_for_qiita_1_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/8e53dfa2-e319-3dea-63f4-d52066fe5954.png)

入力後、右上の保存ボタンを押すと、新しく「合計」というフィールドが作成されます。

![image_for_qiita_1_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3062041/6d857072-31cc-01f6-3414-920858f16379.png)


# 日付型の変換
計算フィールドを使って、「文字型、数値型から日付型」および「日付型から文字型、数値型」の変換を行います。

### 文字型から日付型
`{日付}`は、文字型とします。文字型を日付型にするには、`parseDate`関数を使用します。`parseDate`の最初の引数に変換したいカラム、２番目の引数にフォーマット（今回は`yyyyMMdd`）を指定します。
```python:文字型から日付型
parseDate({日付}, "yyyyMMdd")
```

### 数値型から日付型
`{日付}`は、数値型とします。数値型を日付型にするには、次に２段階のステップを踏みます。
1.  数値型から文字型
2.  文字型から日付型 

1の数値型から文字型に変換するには、`toString`を使用します。2の文字型から日付型については、`parseDate`関数を使用し、`parseDate`の最初の引数に変換したいカラムを文字列に変換したもの、２番目の引数にフォーマット（今回は`yyyyMMdd`）を指定します。

```python:数値から日付型
parseDate(toString({日付}), "yyyyMMdd")
```
### 日付型から数値型
`{日付}`は、日付型とします。日付型を数値型にするには、`extract`関数を使用します。`extract`を使用すると、日付の年や月、日などを数値として抽出できます。`extract`の最初の引数に、抽出したい期間のフォーマット、２番目の引数に変換したいカラムを指定します。抽出した年、月、日の数値に対し、`年×10000 + 月×100 + 日`の計算をすれば、数値としての日付が取得できます。

```python:日付型から数値型
extract("YYYY", {日付}) * 10000 + extract("MM", {日付}) * 100 + extract("DD", {日付})
```

### 日付型から文字型
`{日付}`は、日付型とします。日付型を文字型にするには、次に２段階のステップを踏みます。
1.  日付型から数値型
2.  数値型から文字型 

1の日付型から数値型については、先に説明した「日付型から数値型」と同じです。2の数値型から文字型については、`toString`を使用します。
```python:日付型から文字型
toString(extract("YYYY", {日付}) * 10000 + extract("MM", {日付}) * 100 + extract("DD", {日付}))
```

# 今回使用した関数
今回使用した関数は、以下の通りです。QuickSightの関数については、ユーザーガイドの[カテゴリ別関数](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/functions-by-category.html)にまとめられています。

- [toString](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/toString-function.html)
- [parseDate](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/parseDate-function.html)
- [extract](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/extract-function.html)

# 参考文献
[QuickSightユーザーガイド](https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/welcome.html)