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

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

Power Query:土日祝日を判定する

土日の判定は簡単なんだけど、祝日の判定には祝日リストが必要。これは Excelと全く同じ。ただ国民の祝日一覧は「年」さえ指定すれば簡単に作れる。

祝日を判定するには祝日一覧がないとなんともならないので、まずはそこから。今回は当年に前後一年を加えた、3年分の一覧を「Holidays JP API」の WebAPIを使わせてもらって作成する。

祝日一覧
let
    年テーブル = [
        当年 = Date.Year(テーブル1{0}[日付]),
        年リスト = List.Transform({-1,0,1}, each 当年+_),
        テーブル変換 = Table.FromColumns(
            {年リスト}, type table [年=number]
        )
    ][テーブル変換],
    祝日列の追加 = Table.AddColumn(年テーブル, "祝日", each [
        年 = [年],
        URL1 = "https://holidays-jp.github.io/api/v1/★/date.json",
        URL2 = Text.Replace(URL1, "★", Number.ToText(年)),
        変換 = Record.ToTable(Json.Document(Web.Contents(URL2)))
    ][変換], type table),
    列の選択 = Table.SelectColumns(祝日列の追加,{"祝日"}),
    祝日列の展開 = Table.ExpandTableColumn(
        列の選択, "祝日", {"Name", "Value"}, {"日付", "名称"}
    ),
    型の変更 = Table.TransformColumnTypes(
        祝日列の展開, {{"日付", type date}, {"名称", type text}}
    )
in
    型の変更

上記のクエリを「接続のみ」で読み込んでおく。

あとは「日付」列(Date型)のあるテーブル1を別途読み込んで、フラグ列を追加すればおしまい。

土日祝日フラグ
let
    ソース = テーブル1,
    フラグ列の追加 = Table.AddColumn(ソース, "フラグ", each [
        数値 = [数値],
        chk1 = Date.DayOfWeek([日付],1)<5,
        chk2 = (try 祝日一覧{[日付=[日付]]})[HasError],
        休日判定 = if chk2 then if chk1 then 0 else 1 else 2
    ][休日判定])
in
    フラグ列の追加

「chk1」で平日かどうかをチェックし、「chk2」で祝日一覧にない日付かをチェックしている。土日も祝日も「1」でいいなら休日判定を下記に変更。

        休日判定 = if chk1 and chk2 then 0 else 1