このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-046: 顧客データ(customer.csv)の申し込み日(application_date)はYYYYMMDD形式の文字列型でデータを保有している。これを日付型に変換し、顧客ID(customer_id)とともに10件表示せよ。
解答ワークフローは以下のようになります。
今回の問題は、文字列型のデータを日付型に加工する問題となります。45問目の逆を行う問題です。これを行うには日時ツールもしくはフォーミュラツール内の関数DateTimeParseで行います。フォーミュラツールの場合、DateTimeParseかDateTimeFormatかどっちかよくわからなくなるので(少なくとも筆者はよくなります)、お気をつけいただければと思います。
日付ツールを使うケース
今回は、日付ツールで「文字列型→日時型」の変換の機能を利用します。この場合、設定の一番上の「変換するフォーマットを選択」のところで「文字列を日付/時刻形式に変換する」を選択します。
その他、「変換する文字列フィールドを選択」のところは変換元のフィールドである「application_date」を選択しましょう。次に、新しい列名を指定します。言語設定は、言語に応じてよく使うパターンが異なるため、このプリセットを変更することができます(しかし、なぜか日本でよく使われるスラッシュ区切りがないのは不思議です)。
文字列→日時型の場合は、入力されてきた文字列のパターンが一致するものをプリセットから選択します。プリセットになければカスタムを選択し、フィールドの形式を指定します。
今回は、「20150905」といった形式でインプットされてきているので、これにあうようなプリセットを選択します。つまり「yyyyMMdd」となります。
カスタムセッティングの場合、下側にある例、出力、というところにカスタム設定で行ったものがそのまま反映されるため、こちらを参考にしながら設定を行いましょう。ちなみに、書式はこちらから確認できますが、以下にサンプル含めてご紹介します。ちなみに、日付型→文字列型の場合の内容に限って記載しています。
カテゴリ | 書式 | 説明 | サンプル(日本語) | サンプル(英語) |
---|---|---|---|---|
年 | yyyy | 4 桁の数字で表記されてる年として認識します。2桁の数字も受け入れられ、”yy” パターンの場合と同様にマップされます。 | 2022 | 2022 |
yy | 年が最後の 2 桁の数字で表記されているものとして認識します。2 桁の年は、現在の年マイナス 66 年から現在の年プラス 33 年の範囲にマップされます。例えば、2016 の場合、2 桁の年は 1950 – 2049 の範囲でマップされます。また、4 桁の数字も受け入れられます。 | 22 | 22 | |
月 | M | 先頭に 0 が付いていない数字の月として認識します。 | 1 | – |
MM | 1 桁月の先頭に 0 がついているものとして、数字で表記された月として認識します。先頭の 0 はあってもなくても問題ありません。 | 01 | 01 | |
MMM | 月名が省略形で表記されているものとして認識します。 | 1月 | Jan | |
MMMM | 完全な名前で表記された月名として認識します。 | 1月 | January | |
Mon | 月名を 3 文字の省略形で表記されたものとして認識します。フルネームの月名も受け入れます。 | 1月 | Jan | |
Month | 月名で表記します。省略形でも受け入れます。 | 1月 | January | |
日 | d | 1 桁の日の先頭に 0 を付けずに、日付を数字で表記されたものとして認識します。 | 2 | – |
dd | 1 桁の日の先頭に 0 を付けて、日付を 2 桁の数字で表記されているものとして認識します。頭の0はあってもなくても構いません。 | 02 | 02 | |
曜日 | day | 完全な名前で表記された曜日として認識します。 | 日曜日 | Sunday |
dy | 曜日を 3 文字の省略形で表記されたものとして認識します。フルネームも受け入れます。 | 日 | Sun | |
EEEE | 完全な名前で表記された曜日として認識します。 | 日曜日 | Sunday |
なお、曜日は単独でインプットすることはできません。
ちなみに、プリセットにある形式と同じ内容を書くと、強制的にプリセットが選択されます(アイコンを次にクリックしたときにはプリセットに変わっています)。
話を戻して、元のワークフローの話に戻りたいと思います。
ここであとは不要項目を削除して、最初の10件をサンプリングツールなどで取得すれば完了です。
フォーミュラツール使用の場合
次に、日付ツールではなくフォーミュラツールを使う方法をご紹介します。
フォーミュラツール使う場合は、DateTimeParse関数を使っていきます。設定としては以下のとおりです。
DateTimeParse関数は以下の書式となります。
DateTimeParse(dt,f,l)
dt | 日付型/日時型 | 日付型、日時型のフィールドまたは値 |
f | フォーマット | %a、%Yなどの指定フォーマット |
l | 言語 | 言語オプション。省略すると英語になります。言語オプションで受け入れ可能な月や曜日の名称が変わります(英語だとSundayが受け入れ可能だが日曜日は受け入れできない)。 |
フォーマットは日時ツールのカスタムフォーマットと同じように独自のフォーマットが存在します。こちらも文字列型→日付型の変換の場合に限って掲載します。ソースはこちらとなります。ちなみに、これらは日時ツールでも使用可能です。
カテゴリ | 書式 | 説明 | サンプル(日本語) | サンプル(英語) |
---|---|---|---|---|
年 | %y | 西暦年の下 2 桁。最大 4 桁が読み取られ、区切り記号または文字列の末尾で停止し、現在の年から 66 を引いたものと現在の年から 33 を足したものまでの範囲にマッピングされます。例えば、2016 では、1950 – 2049 が範囲となります。 | 22 | 22 |
%Y | 2桁または4 桁の西暦年として読み込まれます。2 桁の場合は、現在の年から 66 を引いたものと、現在の年から 33 を足したものまでの範囲にマッピングされます。例えば、2016 では、1950 – 2049 が範囲となります。 | 2022 22 | 2022 22 | |
月 | %m | 1 桁または 2 桁の月の数字として読み込み | 01 | 01 |
%b,%h | 月名の有効な省略形 (Sep、SEPT) | 1月 | Jan | |
%B | 月名または月名の有効な省略形 (Sep、SEPT) | 1月 | January | |
日 | %d,%e | スペースを無視して 1 桁または 2 桁 | 02 2 | 02 2 |
%j | 年の日を 3 桁で示す連番、001 – 365 | 002 | 002 | |
曜日 | %a | 曜日の有効な省略形 (mon、Tues、Thur) | 日 | Sun |
%A | 曜日の名前または曜日の有効な省略形 (mon、Tues、Thur) | 日曜日 | Sunday |
文字列型→日付型の場合は比較的融通が効くような形ですが、逆の場合にできた週の日曜日からの日数などの便利なオプションは使えなくなっています(年とその年の1/1からの経過日を%y %jなどで入力することは可能です)
さて、元のワークフロー作成に戻ります。
今回の計算式は以下のとおりです。
DateTimeParse([application_date],"%Y%m%d","日本語")
ここであとは不要項目を削除して、最初の10件をサンプリングツールなどで取得すれば完了です。
複数フィールドフォーミュラ
少し応用的なワークフローになりますが、複数フィールドフォーミュラを使ってみたいと思います。複数フィールドフォーミュラは、基本的に同じ数式を複数のフィールドに一度に適用するツールです。しかしながら、今回1つのフィールドのみを取り扱うわけですが、フォーミュラツールになくて今回のような場合に使える便利な機能が一つ備わっています。
フォーミュラツールは、すでに存在している既存のフィールドに対してデータ型を変更することはできません。しかし、複数フィールドフォーミュラは、既存のフィールドに対してデータ型を変更することができてしまいます(フォーミュラでもこれくらいできて欲しいところですが・・・)。
使い方を見ていきましょう。
使う関数は、フォーミュラツールと同様DateTimeParseなので関数の詳細は割愛します。
処理を行いたいフィールドに対してチェックをいれます。また、今回のポイントは、「出力タイプを変更」オプションです。フィールド型を変更したい場合にチェックを入れ、変更後のデータ型を選択します。
これによりワークフローとしては以下のようになります。
まとめ
今回は、日時ツールもしくはフォーミュラツールを使った日付型からテキスト型への変換方法を学ぶことのできる問題でした。
コメント