Power Queryに慣れてくると、ステップ数を減らしたくなりませんか?
私はなります。
そして頑張ってステップ数を減らした結果、エラーが発生しました。
同じ事象にぶち当たっている方の参考になれば幸いです。
【やりたかったこと】
- 開始時刻データを「時(Hour)」と「分(Minute)」に分割
- 分割後の「時(Hour)」の値が10時以降の場合、「10時以降です」と新規列に表示する
(以下コードは「詳細エディター」よりコピペしたものです)
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
区切り記号の前に挿入されたテキスト = Table.AddColumn(ソース, "区切り記号の前のテキスト", each Text.BeforeDelimiter([開始時刻], ":"), type text),
変更された型 = Table.TransformColumnTypes(区切り記号の前に挿入されたテキスト,{{"区切り記号の前のテキスト", Int64.Type}}),
追加された条件列 = Table.AddColumn(変更された型, "開始時刻判定", each if [区切り記号の前のテキスト] >= 10 then "10時以降です" else null)
in
追加された条件列
元の「開始時刻」列は残しておきたかったため、「列の分割」ではなく「列の追加(Table.AddColumn)」で開始時刻からHour・Minuteを抽出しました。
【データの型変更】
今回読み込んだ「開始時刻」は「08:45」のように秒数がなく、ゼロパディングされています。
そのため値は「テキスト型」として認識されています。
最終的には「Hourが10時以降か」という数値の比較を行いたいので、型変更(Table.TransformColumnTypes)で整数(Int64.Type)を指定しました。
【ステップを減らす】
ここで「列の追加(Table.AddColumn)」に戻って引数を確認すると、「type text」と型の指定が行われていることに気が付きます。
これって、初めからこの引数に整数(Int64.Type)を指定おけば、その次の「型の変更」ステップを削除できるのでは・・・?
ということで、ステップを以下のように変更してみました。
let
ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
// Table.AddColumnの引数で型を指定する
区切り記号の前に挿入されたテキスト = Table.AddColumn(ソース, "区切り記号の前のテキスト", each Text.BeforeDelimiter([開始時刻], ":"), Int64.Type),
// 型変更ステップは削除
追加された条件列 = Table.AddColumn(区切り記号の前に挿入されたテキスト, "開始時刻判定", each if [区切り記号の前のテキスト] >= 10 then "10時以降です" else null)
in
追加された条件列
【エラー発生】
勘のいい方は↑のキャプチャを見た時点でお気づきかもしれません。
Hour(区切り記号の前に挿入されたテキスト)列のヘッダーが「123」と整数アイコンになっているにも関わらず、値は「08」などゼロパディング(=テキスト型として認識)されています。
※勘の悪い私はここで何も気づかず、ハマりまくりました。
そして、先ほどまで問題なかった「Hourが10時以降か」の条件列でエラーが発生しています。
Expression.Error: 演算子 < を型 Number および Text に適用できません。
詳細:
Operator=<
Left=10
Right=08
Power Queryに限った話ではないですが、エラーメッセージって初心者には呪文にしか見えません。
「つまり何をすればいいの?」ってしばらく悩みました。。
【解決策】
ステップを減らすのは諦め、最初に作成したステップ(列追加でテキスト型指定後、整数に型変更)に戻したところ、エラーは解消されました。
初心者的には、Table.AddColumnの引数で型指定するのと、Table.TransformColumnTypesで後から型指定するの、どう異なるのかが分かりません…。
何か分かれば追記しようと思います。
【補足】
今回のサンプルデータは開始時刻が全てHH:MM形式で入力されている前提としています。
もし「未入力の場合はハイフンが入る」などの場合は、整数型へ変換できないので更に注意が必要ですね…。
【参考情報】
実際のデータでは正確な時間計算が必要だったため、以下サイトを参照に時・分値を分割して使用しました。
HH:MM形式の時刻を扱う際は注意です(自戒)。