なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:日付列と時刻行の一覧表を組み替える

画像で見た方が分かりやすいと思うので、早速だが下のような表があるものとする。

「日」の列と「時刻」の行で構成されたマトリクス表から「日時」と「名前」の表に組み替えしたい場合。何となく「列のピボット解除」をすれば良さそうなのは分かると思う。

というわけで、まずは「データ範囲」を読み込む。今回はテーブルではないので「先頭行をヘッダーに昇格」も実行する。

    ソース = Excel.CurrentWorkbook(){[Name="データ範囲"]}[Content],
    昇格されたヘッダー数 = Table.PromoteHeaders(
        ソース, [PromoteAllScalars=true]
    ),

自動的にデータ型の変更もステップに追加されるだろうけど、後で指定し直すことになるのでステップ「変更された型」は削除しておく。

続いて、左端の先頭列以外を選択して「列のピボット解除」を実行。その後にデータ型を変更することで、一覧の日付が増減してもエラーが出なくなる。

    ピボット解除された列 = Table.UnpivotOtherColumns(
        昇格されたヘッダー数, {"Column1"}, "属性", "値"
    ),
    変更された型 = Table.TransformColumnTypes(
        ピボット解除された列,
        {
            {"Column1", type duration},
            {"属性", type datetime},
            {"値", type text}
        }
    ),

この時、後で「属性(日付)」と「Column1(時刻)」を足し算をする必要があるので、時刻列は「type duration(期間型)」にしておくこと。「type time(時刻型)」では次のステップでエラーになってしまう。

後は[列の追加]→[カスタム列の追加]で「= [属性]+[Column1]」を実行すればいい。

    追加されたカスタム = Table.AddColumn(
        変更された型, "日時", each [属性]+[Column1]
    ),
    削除された他の列 = Table.SelectColumns(
        追加されたカスタム,{"値", "日時"}
    )

整理すると下記の通り。

let
    ソース = Excel.CurrentWorkbook(){[Name="データ範囲"]}[Content],
    ヘッダーへの昇格 = Table.PromoteHeaders(
        ソース, [PromoteAllScalars=true]
    ),
    列のピボット解除 = Table.UnpivotOtherColumns(
        ヘッダーへの昇格, {"Column1"}, "日付", "名前"
    ),
    型の変更 = Table.TransformColumnTypes(列のピボット解除, {
        {"日付", type datetime},
        {"Column1", type duration},
        {"名前", type text}
    }),
    日時列の追加 = Table.AddColumn(
        型の変更, "日時", each [日付]+[Column1], type datetime
    ),
    列の選択 = Table.SelectColumns(日時列の追加, {"名前", "日時"})
in
    列の選択

もし「時刻」の列が「9」「10」みたいな数値だった場合は、「列のピボット解除」以降のステップを下記に変更。

    列の追加 = Table.AddColumn(
        列のピボット解除, "Column2",
        each #duration(0, [Column1], 0, 0), type duration
    ),
    型の変更 = Table.TransformColumnTypes(列の追加, {
        {"日付", type datetime}, {"名前", type text}
    }),
    日時列の追加 = Table.AddColumn(
        型の変更, "日時", each [日付]+[Column2], type datetime
    ),
    列の選択 = Table.SelectColumns(日時列の追加, {"名前", "日時"})