データサイエンス100本ノックをAlteryxで。50日目(解答)

100本ノック

このページは解答編です。

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-050: レシート明細データ(receipt.csv)の売上エポック秒(sales_epoch)を日付型に変換し、「月」だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに10件表示せよ。なお、「月」は0埋め2桁で取り出すこと。

※出力するデータはsales_monthとする

解答ワークフローは以下のようになります。

今回の問題は、48問目で求めた「UNIX秒で提供されている数値型のデータを日付型に加工する」というところに加えて得られた日付型のデータから望む形、今回で言えば「」を取り出す問題となります。48問目までは前回解説していますのでそちらを参照していただくとして、ここでは48問目の解答の結果から先を実際に見ていきたいと思います。

というとことで、以下の部分からスタートします。

この時点では以下のようなデータが得られていると考えてください(先頭から5レコード、sales_dateフィールドのみ表示しています)。

日時ツール使用の場合

日時ツールの場合は以下のような設定となります。変換するフォーマットを選択は、「日時/時刻形式を文字列に変換する」、変換する日付/時刻フィールドは、48問目で作った「sales_date」、新しい列名は「sales_month」とします。形式としては、のみ取得するようなものはプリセットにないので、カスタムを選択肢、「MM」と記載します(必ず大文字で!小文字だと「分」になってしまいます)。

これで完了です。上の設定画面の一番右下にある出力サンプルを見ると、のみが得られています。

あとは、不要な項目を削除し、先頭から10レコードを取得すれば完了です。以下のようなワークフローとなります。

フォーミュラツール使用の場合

フォーミュラツール使用の場合は、DateTimeMonth関数を使います。

DateTimeMonth

DateTimeMonth(dt)
dtDateTime型日時型のフィールドもしくは値

単純に日時型のフィールドのみを指定するだけの関数であるため、非常にシンプルな関数です。

さて、ここからDateTimeYearを使った49問目と大きく異なるポイントが存在します。この関数の戻り値は数値型です。そのため、一桁の月は頭に0がつかない一桁の数字になってしまいます。そのため、一桁の月の場合は左側に0を詰める必要があります。これを行うのが、PadLeft関数です。

PadLeft

PadLeft (String, len, char)
String文字列文字列型のフィールドもしくは値。ここで指定した文字列の長さとlenで指定した長さを比較し、不足していればcharで指定している文字を文字列の左側に追加します。
lenlength文字を埋め込んだあとの文字列の長さ。不足している数だけインプットされた文字の左側にcharで指定した文字を詰め込みます。
charchar型文字(1文字)

例えば、PadLeft(“10″,3,”0”)とすると、文字列「10」は2文字のところ、指定の3文字に対して1文字不足しているので、「10」の左側に「0」を1つ追加して「010」と出力します。

今回の場合のフォーミュラツールの設定は以下の通りです。DateTimeMonthの結果は数値で得られるため、ToString関数で文字列にしてからPadLeft関数で0埋めを行います。

PadLeft(ToString(DateTimeMonth([sales_date])), 2, "0")

これで完了です。データプレビューでものみが表示されています。

あとは、不要な項目を削除し、先頭から10レコードを取得すれば完了です。以下のようなワークフローとなります。

フォーミュラツールをまとめてみましょう

上の例では複数のフォーミュラツールが存在していますが、まとめることが可能です。また、セレクトツールも単に型の変換をしているだけなので、関数でやってしまいましょう。

まず、[sales_epoch]を数値型にします。数値型にするにはToNumber関数を使います。

ToNumber([sales_epoch])

次に、48問目にあったDateTimeAddを組み合わせると以下のようになります。

DateTimeAdd("1970-01-01 00:00:00",ToNumber([sales_epoch]),"sec")

次に、今回の計算式は以下のようなものでした。

DateTimeMonth([sales_date])

これを組み合わせると以下のようになります。

DateTimeMonth(DateTimeAdd("1970-01-01 00:00:00",ToNumber([sales_epoch]),"sec"))

あとは、ToStringで囲って、さらにPadLeft関数を使います。

PadLeft(ToString(DateTimeMonth(DateTimeAdd("1970-01-01 00:00:00",ToNumber([sales_epoch]),"sec"))), 2, "0")

フォーミュラツールの設定としては以下のようになります。

あとは不要な項目を削除して先頭から10件抽出すれば完了です。

非常にすっきりしたワークフローになりました。

まとめ

今回は、日時型のデータを欲しい形、今回は「」で取り出す問題でした。日時ツールやDateTimeMonth関数などが利用可能ですが、DateTimeMonth関数の場合は文字列型に変更してPadLeft関数で0埋めを行う必要があります。もちろん、DateTimeFormat関数も使うことができます。

解答ワークフローダウンロード

※2022/10/16 「フォーミュラツールをまとめてみましょう」の部分にて、ToStringと書いていましたが、正しくはToNumberです。訂正させていただきます。

コメント

タイトルとURLをコピーしました