このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-051: レシート明細データ(receipt.csv)の売上エポック秒(sales_epoch)を日付型に変換し、「日」だけ取り出してレシート番号(receipt_no)、レシートサブ番号(receipt_sub_no)とともに10件表示せよ。なお、「日」は0埋め2桁で取り出すこと。
※出力するデータはsales_dayとする
解答ワークフローは以下のようになります。
今回の問題は、48問目で求めた「UNIX秒で提供されている数値型のデータを日付型に加工する」というところに加えて得られた日付型のデータから望む形、今回で言えば「日」を取り出す問題となります。これは、50問目とほぼ同じ問題で、一部の設定と関数が異なるくらいです。48問目までは前回解説していますのでそちらを参照していただくとして、ここでは48問目の解答の結果から先を実際に見ていきたいと思います。
というとことで、以下の部分からスタートします。
この時点では以下のようなデータが得られていると考えてください(先頭から5レコード、sales_dateフィールドのみ表示しています)。
日時ツール使用の場合
日時ツールの場合は以下のような設定となります。変換するフォーマットを選択は、「日時/時刻形式を文字列に変換する」、変換する日付/時刻フィールドは、48問目で作った「sales_date」、新しい列名は「sales_day」とします。形式としては、日のみ取得するようなものはプリセットにないので、カスタムを選択肢、「dd」と記載します。
これで完了です。上の設定画面の一番右下にある出力サンプルを見ると、日のみが得られています。
あとは、不要な項目を削除し、先頭から10レコードを取得すれば完了です。以下のようなワークフローとなります。
フォーミュラツール使用の場合
フォーミュラツール使用の場合は、DateTimeDay関数を使います。
DateTimeDay
DateTimeDay(dt)
引数名 | データ型 | 説明 |
---|---|---|
dt | DateTime型 | 日時型のフィールドもしくは値 |
単純に日時型のフィールドのみを指定するだけの関数であるため、非常にシンプルな関数です。
今回の場合のフォーミュラツールの設定は以下の通りです。DateTimeDayの結果は数値で得られるため、ToString関数で文字列にしてからPadLeft関数で0埋めを行います。
PadLeft(ToString(DateTimeDay([sales_date])), 2, "0")
これで完了です。データプレビューでも日のみが表示されています。
あとは、不要な項目を削除し、先頭から10レコードを取得すれば完了です。以下のようなワークフローとなります。
フォーミュラツールをまとめてみましょう
上の例では複数のフォーミュラツールが存在していますが、まとめることが可能です。また、セレクトツールも単に型の変換をしているだけなので、関数でやってしまいましょう。
まず、[sales_epoch]を数値型にします。数値型にするにはToString関数を使います。
ToString([sales_epoch])
次に、48問目にあったDateTimeAddを組み合わせると以下のようになります。
DateTimeAdd("1970-01-01 00:00:00",ToString([sales_epoch]),"sec")
次に、今回の計算式は以下のようなものでした。
DateTimeDay([sales_date])
これを組み合わせると以下のようになります。
DateTimeDay(DateTimeAdd("1970-01-01 00:00:00",ToString([sales_epoch]),"sec"))
あとは、ToStringで囲って、さらにPadLeft関数を使います。
PadLeft(ToString(DateTimeDay(DateTimeAdd("1970-01-01 00:00:00",ToNumber([sales_epoch]),"sec"))), 2, "0")
フォーミュラツールの設定としては以下のようになります。
あとは不要な項目を削除して先頭から10件抽出すれば完了です。
非常にすっきりしたワークフローになりました。
DateTimeFormat関数を利用
最後に、DateTimeFormat関数でもやってみたいと思います。
DateTimeFormat関数は、日時型のデータをほしい形で取得する関数で、DateTimeYear/Month/Dayのように単一の値を取り出すのではなく、自由な指定が可能であるのが特徴です。今回は一桁であれば一桁目が0で埋める形で日を取得したいということですので、「%d」というフォーマットが利用可能です。これにより以下のようになります。
DateTimeFormat([sales_date],"%d","日本語")
今回はさんざんDateTimeYear/Month/Day関数を使いましたが、MonthやDayについては単なる数値で取得するわけではないため(一桁の場合、0埋めが必要でした)PadLeft関数やToString関数と組み合わせて複雑な関数となっていました。このような場合は、DateTimeFormatの方がシンプルに記述できて良いかと思います。
最終的なワークフローとしては以下のような形になります。
まとめ
今回は、日時型のデータを欲しい形、今回は「日」で取り出す問題でした。日時ツールやDateTimeDay関数などが利用可能ですが、DateTimeDay関数の場合は文字列型に変更してPadLeft関数で0埋めを行う必要があります。もちろん、DateTimeFormat関数も使うことができます。
コメント