QlikViewやQlik Senseで使えるマスターカレンダー(日本の祝日対応版)を公開しました

QlikViewやQlik Senseで使えるマスターカレンダー(日本の祝日対応版)を公開しました

Pocket

QlikViewやQlik Senseで使えるマスターカレンダーをご用意しましたので、ぜひご利用ください。

QlikViewやQlik Senseでカレンダーを自動生成するサンプルスクリプトはよく見かけますが、日本の祝日に対応したものがなかったため作成してみました。
カレンダーを自動生成するスクリプトに加え、「国民の祝日に関する法律」が制定された1948年から、2099年までの作成済みデータ(CSVファイル)も同梱しています。
振替休日や国民の休日にも対応した完全版ですので、ぜひダウンロードして使ってみてください。

2021年1月14日更新
令和三年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法に対応しました。
令和3年(2021年)に限った祝日の移動に対応しています。
2019年2月12日更新
祝日法の改正に対応しました。
天皇の即位の日の追加、天皇誕生日の変更、東京オリンピックなどのための特別措置といった、最新の祝日法に対応しています。
祝日法の改正については以下のページで確認しています。
国民の祝日について – 内閣府祝日法の改正

ダウンロード

ファイルはこちらです。ダウンロードしてご自由にお使いください。
master-calendar.zip 最新版(2021年1月14日作成)

上記のZipファイルには以下の3種類、計6個のファイルが含まれています。
「holidays」ではじまるファイルは祝日のみのデータ、「calendar」ではじまるファイルは平日を含むカレンダーのデータです。
  • csv
    CSVファイルです。「国民の祝日に関する法律」が制定された1948年から2099年までのデータが含まれています。
    ファイル:holidays.csv(祝日のみ)、calendar.csv(平日を含むカレンダー)
  • qvs
    QlikViewやQlik Senseで使える自動生成用のスクリプトです。拡張子がqvsとなっていますが中身はテキストファイルです。
    ファイル: holidays.qvs(祝日のみ)、calendar.qvs(平日を含むカレンダー)
  • qvw_qvf
    QlikViewのドキュメント、およびQlik Senseのアプリです。祝日のデータと、平日を含むカレンダーのデータを両方取り込んであり、結果の確認用にごく簡単なテーブルなどを配置してあります。
    ファイル:calendar.qvw(QlikViewのドキュメント)、calendar.qvf(Qlik Senseのアプリ)

  • 祝日の計算について

    祝日の計算については、以下のJavaScriptのライブラリを参考にさせていただきました。
    GitHub – osamutake/japanese-holidays-js: Provides utilities to manipulate japanese holidays.
    https://github.com/osamutake/japanese-holidays-js

    また、祝日の定義や結果の確認には、Wikipediaの各ページを参考にいたしました。
    国民の祝日春分秋分振替休日国民の休日

    スクリプトの使い方

    スクリプトを使用するには、qvsファイルの内容をロードスクリプトに貼り付けて使用するか、またはInclude文によりqvsファイルを読み込んでください。

    日付の指定方法

    holidays.qvsとcalendar.qvsは、いずれも作成する日付の範囲を指定できます。
    • holidays.qvs
      スクリプトよりも前に以下のように指定すると、作成する日付の範囲を指定できます。
      SET StartYear = 1948;
      SET EndYear = 2099;
      
      なにも指定しなかった場合は、今年(実行したときの日付)一年分のデータを作成します。
    • calendar.qvs
      スクリプトよりも前に以下のように指定すると、作成する日付の範囲を指定できます。
      SET StartDate = '1948/07/20';
      SET EndYear = '2099/12/31';
      
      なにも指定しなかった場合は、今月(実行したときの日付)一ヶ月分のデータを作成します。

    使用例

    //祝日生成スクリプトの読み込み
    SET StartYear = 1948;
    SET EndYear = 2099;
    
    $(Include=C:\Users\qlik\Desktop\holidays.qvs); //注1
    RENAME Field HolidayDate to Date; //注2
    
    //カレンダー生成スクリプトの読み込み
    SET StartDate =  '1948/07/20';
    SET EndDate = '2099/12/31';
    
    $(Include=C:\Users\qlik\Desktop\calendar.qvs); //注1
    
    注1:qvsファイルのディレクトリは適宜変更してください。Qlik Senseをお使いの方は、さらに下の「Qlik SenseでのInclude文」もご確認ください。
    注2:祝日テーブルでは日付の項目名を「HolidayDate」に、カレンダーテーブルでは日付の項目名を「Date」という名前にしています。
    これらを関連付けたい場合は、RENAME文などで項目名を変更し、おなじ名前にしてください。

    Qlik SenseでのInclude文

    Qlik Senseではセキュリティの都合により、あらかじめ指定したディレクトリにあるファイルしか読み込めないようになっています。
    Include文を使用するには、ファイルの置き場所をあらかじめデータ接続として定義しておく必要があります。
    [接続の新規作成]→[フォルダ]を選択します。
    master-calendar-101
    パスと使用する名前を指定します。ここではパスに「.」を指定してカレントディレクトリ(qvfファイルとおなじディレクトリ、既定ではC:\Users\<ユーザー名>\Documents\Qlik\Sense\Apps)を指定しています。
    master-calendar-102
    定義した名前を使用して、Include文を指定します。
    $(Include=lib://CurrentDir/holidays.qvs);
    master-calendar-103

    マスターカレンダーとは?なぜカレンダーのデータが必要なのか?

    今回カレンダーのデータを公開しましたが、そもそもなぜカレンダーのデータが必要なのかというと、おもに以下の2つの理由が挙げられます。
    • 必要な日付データをすべて用意しておくため
    • 企業独自のルールや、日本独自の祝日の計算を簡単におこなうため
    これらは、QlikViewやQlik Senseに限らず、ほかのソフトウェアにもある課題かと思いますが、QlikViewやQlik SenseはインメモリBIツールということもあり、複雑な日付演算を都度おこなうよりも、汎用的なカレンダーを作成してメモリに取り込んでおくという手法をよく採用します。
    この汎用的なカレンダーのことを”マスターカレンダー”と呼びます。

    マスターカレンダーという名前は正式な機能名などではないのですが、開発元のコミュニティサイトなどにも出てきますし、QlikViewやQlik Senseの技術者の間では普通に通じる単語です。
    言ってみれば、マスターカレンダーは開発のベストプラクティス、またはデザインパターンといった位置付けのものです。

    明細データから日付の範囲を自動取得する方法

    カレンダーの開始日、終了日を固定で指定するのではなく、明細のデータにあわせて自動取得したい場合があります。
    たとえば、データベースに売上明細のテーブルがあったときに、これに含まれる日付の範囲でカレンダーを自動生成するということです。
    その場合は以下のサンプルを参考にしてください。
    売上明細:
    LOAD ...
    FROM ...;
    
    //Residentにより売上明細を再読み込みし、日付の最小値と最大値を取得します。
    StartEndDate:
    LOAD Min(日付) AS StartDate,
         Max(日付) AS EndDate
    Resident 売上明細;
    
    //Peek関数を使用して、最小値と最大値を変数に格納します。
    LET StartDate =Peek('StartDate');
    LET EndDate =Peek('EndDate');
    LET Days = EndDate - StartDate + 1;
    
    DROP Table StartEndDate;
    
    Calendar:
    LOAD Date('$(StartDate)' + RecNo() - 1, 'YYYY/MM/DD') as 日付
    :
    AutoGenerate Days;
    

    その他の関連機能

    マスターカレンダーの話からは逸れますが、Qlik Senseにはカレンダーに関する機能がいくつかありますので、ご紹介いたします。

    自動取得項目(Declare文、Derive文)

    Qlik Senseでは、日付の項目を取り込むと自動的に年、月、日などの項目が作成されます。
    詳細はヘルプの以下のページをご参照ください。
    自動取得項目 窶鈀 Qlik Sense

    自動的にDeclare文とDerive文が定義されています。これにより、1つの日付から年、月、日などの項目が自動生成されます。
    Declare文を編集することで、自動生成される項目名を変更したり、独自の項目を追加したりできます。
    master-calendar-201
    Year、Monthなどの項目が自動生成されています。
    master-calendar-202

    タイムアウェアチャート(連続スケール)

    Qlik Sense 3.0の新機能にタイムアウェアチャートというものがあります。
    これは、折れ線グラフなどでX軸を日付の項目にすると、自動的に見やすく表示してくれる機能です。
    詳細はヘルプの以下のページをご参照ください。
    タイムアウェア チャート 窶鈀 Qlik Sense
    ヘルプには折れ線グラフのみに対応していると書かれていますが、新バージョンで機能が拡張され、折れ線グラフに加えて棒グラフとコンボチャートにも対応しています

    タイムアウェアチャートは、[プロパティ]パネル→[X軸:<項目名>]→[連続]→[連続スケールの使用]から設定できます。
    初期設定で有効になっているため、無効にしたい場合以外は、この設定を操作する必要はありません。
    master-calendar-203
    タイムアウェアチャートを無効にしたい場合は、[連続スケールを使用]をオフにしてください。
    タイムアウェアチャートが無効な場合、データとして存在する日付のみが表示されます。たとえば、下図では2008年1月4日や1月6日の値がありませんが、これはデータ中に存在しないためです。
    master-calendar-204
    タイムアウェアチャートが有効な場合、データに応じて自動的に年、月、日の表示が切り替わります。
    下図は年の表示です。2008年に絞り込むと
    master-calendar-205
    月の表示にドリルダウンします。さらに1月に絞り込むと
    master-calendar-206
    日の表示にドリルダウンします。タイムアウェアチャートが無効な場合に表示されていなかった、1月4日や1月6日の値も表示されています。
    master-calendar-207

    最後に…

    今回はマスターカレンダーのサンプルをご紹介しましたが、いかがだったでしょうか。
    冒頭に書いたとおり、マスターカレンダーのサンプルスクリプトはよく見かけるのですが、日本の祝日に対応したものが無かったため、いつか作りたいと思っていました。
    今回作成したものがお役に立てば幸いです。
    GitHub – osamutake/japanese-holidays-js: Provides utilities to manipulate japanese holidays.
    https://github.com/osamutake/japanese-holidays-js
    祝日の計算を定義する際に、参考にさせていただいたJavaScriptのライブラリです。
    また、祝日の定義や結果の確認には、Wikipediaの各ページを参考にいたしました。
    国民の祝日春分秋分振替休日国民の休日

    2019年から2020年にかけての祝日法改正については、以下のページを参考にいたしました。
    国民の祝日について – 内閣府
    https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
    祝日法の改正
    http://nomenclator.la.coocan.jp/ip/holiday/rev/syuku.htm

    自動取得項目 窶鈀 Qlik Sense
    http://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/Scripting/derived-fields.htm

    タイムアウェア チャート 窶鈀 Qlik Sense
    https://help.qlik.com/ja-JP/sense/3.1/Subsystems/Hub/Content/Visualizations/time-aware-charts.htm

    Qlik Design Blog : What’s new in Qlik Sense 3.0… | Qlik Community
    https://community.qlik.com/blogs/qlikviewdesignblog/2016/07/15/what-s-new-in-qlik-sense-30-time-aware-charts
    タイムアウェアチャートについて、アニメーション付きで紹介しているページです。

    Qlik Design Blog : Time-Aware feature has made … | Qlik Community
    https://community.qlik.com/blogs/qlikviewdesignblog/2016/12/06/time-aware-feature-has-made-it-to-the-bar-and-the-combo-charts
    タイムアウェアチャートが、棒グラフとコンボチャートにも対応したことを解説しているページです。おなじくアニメーション付きです。

    How to use – Master-Calendar and Date-Values | Qlik Community
    https://community.qlik.com/docs/DOC-8843
    日付とカレンダーについての情報をまとめたリンク集です。

    以下の4つはマスターカレンダーの詳細について書かれたページです。
    マスターカレンダーは”マスター”と言っても、一回しか読み込まれない訳ではありません。たとえば、注文月が9月のときに、請求月は10月の場合があります。
    このような場合、1つのドキュメント中で複数回マスターカレンダーを読み込むのですが、その点の詳細について解説されています。
    Qlik Design Blog : The Master Calendar | Qlik Community
    https://community.qlik.com/blogs/qlikviewdesignblog/2012/10/16/the-master-calendar

    Qlik Design Blog : Why You sometimes should Loa… | Qlik Community
    https://community.qlik.com/blogs/qlikviewdesignblog/2012/08/30/master-table-with-multiple-roles

    Qlik Design Blog : Canonical Date | Qlik Community
    https://community.qlik.com/t5/Qlik-Design-Blog/Canonical-Date/ba-p/1463578

    Linking to two or more dates | Qlik Community
    https://community.qlik.com/docs/DOC-5834