WeeklyAlteryxTips#60 日付をカウントするいくつかの方法

Alteryx

今回は、2つの日にちの間の日数のカウントをしてみましょう。

例えば、顧客満足度の分析などで、受注してから物を発送するまでの日数がどうなっているか分析したいようなケースがあるかと思います。この場合カウント方法としていくつかのケースが考えられます。

指定する日は、受注日(OrderDate)と発送日(ShippingDate)とします。サンプルとして以下のようなデータを使いましょう。

考えられるパターンは以下のとおりです。

  1. 単純な日数カウント
  2. 土日を除いてカウント
  3. 2に加え、会社カレンダーなど個別に休日も除いてカウント

それぞれについて見ていきましょう。

1.単純な日数カウント

これは関数一発で完了です。DateTimeDiff関数を使うことができます。

DateTimeDiff([ShippingDate],[OrderDate],"day")+1

日付の指定順は、新しい方の日付、古い方の日付、の順にするとプラスの日数になります。逆にするとマイナスの日数になるので気をつけて下さい。

結果は以下のとおりです(DateTimeDiff関数は、カウント的には開始日、もしくは終了日のいずれかを含まないという考え方のようで、両方含んだ時の日数引く1日が答えとして出力されます。好みに応じて+1するかどうか決めて下さい。今回は他と合わせるため+1としています)。

2.土日を除いてカウント

土日を除いてカウントする場合は、頑張れば関数だけでもできますが、いくつかのツールを組み合わせてロジックを組むのが一般的な方法として使われます。この方法は、2つの日付間のレコードを作り出して処理を行うため、日数が非常に長いようなケースや大量のデータを処理する場合は時間がかかってしまうのに注意しましょう。

ワークフローとしては以下のようになります。

一番のポイントは行生成ツールになるかと思います。

ここでは新規フィールドを作成し、データ形(タイプ)としてDateとしています。初期化式は受注日なので、[OrderDate]とし、条件式としては、[ShippingDate]となります。この間の日付を1日ずつ作りたいので、ループ式としては、DateTimeAdd関数で1日足すだけです。

DateTimeAdd([Date],1,"Day")

これにより、各レコードの日付ができます。実際のデータとしては以下のようになります(ここでは最初のレコードから作成されたデータのみ表示しています)。

あとはここから土日を取り除いてカウントするだけです。

曜日の取得は、日時ツールで簡単にできます。

変換するフォーマットは、日時形式のデータを元にするので「日付/時刻形式を文字列に変換する」を選択します。形式は、カスタム形式として言語設定を「English」にし、「dy」としています。言語設定を日本語にするとカスタム形式は「日」「土」と出力されます。英語の場合は「Sat」「Sun」となります。後でフィルターツールで使うだけですおので、英語もしくは日本語いずれかに統一していればどちらでも構いません。なお、「dy」以外に「%a」でも同様の出力となります。

フィルターツールでは、以下のようなカスタムフィルターを使っています。このように複数の文字列に一致しない、とする場合はIN演算子が便利です(一致しないという否定なので頭に「!」をつけていることに注意して下さい)。

!([DayOfWeek] IN ("Sat","Sun"))

あとは、集計ツールで集計します。

最後のソートツールは、AMPエンジンを使っていると並びが変わってしまうため、レコード順(OrderID)に並び替えているだけです。

3.2に加え、会社カレンダーなど個別に休日も除いてカウント

実質的にはこのパターンが一番多いかと思います。実際祝日などもあるので2のパターンだとそれにも対応できません。また、会社の指定休日というものも存在するため、すべてをカバーできるのはこの3のみ、ということになります。

このケースでは、休日かどうかわかるような表が必要となります。一番わかりやすいのは、祝日と会社休日をあわせた表を作っておくことでしょうか(土日は個別に判定できるので不要ですが、土日に出勤日などがあるという場合は土日も含めたテーブルにしておくほうが良いかもしれません)。

今回は、非常に小さなリストを作成しておきました。この表に記載されている日を休日としましょう。土日も休みですが、土日は日時ツールで取得できるので、その結果を使いたいと思います。

ワークフローとしては以下のとおりです。

ベースは2のパターンのワークフローですが、フィルターツールのあとにお休みのリストを結合ツールで結合しています。結合された日はお休みなので、L側の出力を今回使えば、休みリストに乗っている日付を除いたリストが作成されるので、あとはカウントを取るだけです。

最終的な結果は以下のとおりです。

まとめ

  • 2つの指定日付間の日数を計算する方法をご紹介しました
  • 方法としては、以下の3つをご紹介しています
    • 単純な日数のカウント
    • 土日を除いてカウント
    • 休みのリストに基づいてカウント

似たような手法で時間なども計算可能ですが、時間や分、秒になるとさらにデータ量が増えるのでデータ量によっては非常に重いワークフローになるので、ご注意下さい。

サンプルワークフローダウンロード

次回

未定です!

コメント

タイトルとURLをコピーしました