こんにちはコミュニティ
あなたの助けが必要です、もう一度アドバイスしてください。 新しいユーザーとして、学ぶのに苦労しています。
開始日と終了日を含むデータテーブルがあります。 開始日と終了日の間の営業日数を計算したいのですが?? JMP でそれを行う最良の方法は何ですか?? 私のアイデアは、列を追加して式を作成することです。たとえば、日付の差?? しかし、何がより良い選択肢になるのかわかりません。
添付の例を参照してください

ありがとう
マーティン
こんにちは、ジェリー
これは本当に役に立ちました。 自分でリストを作成したところ、欲しいものが表示されました。
ありがとう
マーティン
こんにちは@マルティネ、
私は少し前に、2 つの日付列間の営業日数を計算するアドインを作成しました。 休日や除外したいその他の特定の日は、アドイン ディレクトリに保存されている Holiday List.jmp ファイルを維持することで対処できます。 注: このファイルは、JMP ユーザーのマシンがアクセスできる任意の場所に保持されている任意のドキュメント (Excel、.txt、.csv など) にすることができますが、ファイルの場所を提供するには、基礎となる JSL に若干の調整を行う必要があります。 それ以外の場合は、要求されたニーズをそのまま満たしていると思います。 休日リスト ファイルのダウンロード、インストール、編集については、次の手順に従ってください。 NETWORKDAYS関数
お役に立てれば、
ジェリー
私のお気に入りは昔のノースカロライナです野球休暇。
少し付け加えると、 @Craige_Hales '砂@ジェフ・パーキンソン休日などに関する考えについて、「現地の休日」の計算に関する考えについて言及しました。 「ローカル」の標準的な定義を採用しない限り、それは非常に困難になります。 たとえば、カナダには米国と同様に「感謝祭」の祝日があります。ただし、カナダのカレンダー上の日は米国と異なります。そして、米国の都市や州レベルでさえ私に始めさせないでください。 たとえば、メイン州とマサチューセッツ州では、愛国者の日は祝日であり、米国の他のどこでも祝われません。さらに厄介なことに、一部のビジネスは閉店し、他のビジネスは営業を続けます。 銀行や金融機関も含まれます。
コーディングに取り組むのは私にとって初めてのことで、うまく機能しないように思えます。ただし、いくつかの標準的な公式を試してみて、解決策を見つけました。ただし、営業日のみではなく暦日が使用されます。 この実験では、比較するのに同じであるため、これで十分です。
簡単な解決策は、テスト式を拡張することです。
// define an expression that answers the question
holidays = associativearray({1jan2020,25dec2020});
includeThisDate = Expr(
(2/*monday*/<= Day Of Week( date ) <= 6/*friday*/)
&
!(holidays<<CONTAINS></CONTAINS>2020 年は新年とクリスマスが平日に当たるため、262 ではなく 260 になります。 将来的には連想配列を更新する必要があり、履歴データも必要になる場合があります。 毎年同じ日にならない祝日もあります。 なんとも醜い問題で、それが原因で...
複雑な解決策では、次のようなものを使用する場合があります。 https://www.abstractapi.com/holidays-api
(クレジット: @ジェフ・パーキンソンのために日付と時刻の列を変更して、日付のみを取得します。)
はい、営業日は毎週平日です(月曜から金曜)。現地の祝日も調整できればベストです
助言がありますか?
他の質問も: JMP 日付には常に時刻が含まれており、多くの場合、午前 0 時から 0 秒に設定されます。 しかし、範囲が月曜日の正午から 7 日後の月曜日の正午までである場合、2 つの半月曜日はどのように数えるのでしょうか? それとも月曜始まりの午前0時でも両方カウントすべきでしょうか?
範囲が小さく、多すぎない場合は、日数を数えるのも悪い選択ではないかもしれません (十分にテストされていないコードは次のとおりです)。
// define an expression that answers the question
includeThisDate = Expr(
2/*monday*/<= Day Of Week( date ) <= 6/*friday*/
);
// brute force counting:
countSelectedDaysInRange = Function( {firstDate, lastDate, testexpr},
{date, count},
If( lastDate < firstDate,
Throw( "dates reversed" )
);
count = 0;
For( date = firstDate, date <= lastDate, date += In Days( 1 ),
count += (testexpr != 0)
);
count;
);
Show( 262 == countSelectedDaysInRange( 1jan2020, 31dec2020, Name Expr( includeThisDate ) ) );
Show( 104 == countSelectedDaysInRange( 1jan2020, 31dec2020, Expr( !(2/*monday*/<= Day Of Week( date ) <= 6/*friday*/) ) ) );
Show( 366 == countSelectedDaysInRange( 1jan2020, 31dec2020, 1 ) );// 2020 is leap year
Show( 0 == countSelectedDaysInRange( 1jan2020, 31dec2020, 0 ) );// no days counted262 == countSelectedDaysInRange(01Jan2020, 31Dec2020, Name Expr(includeThisDate)) = 1;
104 == countSelectedDaysInRange(01Jan2020, 31Dec2020, Expr(!(2 <= 曜日(日付) <= 6))) = 1;
366 == countSelectedDaysInRange(01Jan2020, 31Dec2020, 1) = 1;
0 == countSelectedDaysInRange(2020 年 1 月 1 日、2020 年 12 月 31 日、0) = 1;
上記のコードには、最後の日 (<= lastdate) が含まれています。 最初の日時値から始まり 24 時間ずつ増加し、その日時値が式を満たす場合はカウントに 1 を加えます。
痛い経験から、日付と時刻を正しく扱うのは難しいことを知っています。
可能な限り組み込み関数を使用してください。
次にメンテナンスする人のためにコードをコメント化します。
コードを慎重にテストしてください。
また、大まかな近似値だけが必要な場合は、
(2021 年 1 月から 2020 年 1 月 1 日)/indays(1)*5/7 == 261.428571428571
これは 262 カウントに近いです。
編集:日付の差(2020年1月1日、2021年1月1日、「日」)*5/7大雑把な答えではもっと簡単に見えるかもしれません
最初に行う必要があるのは、「稼働日」を定義することです。 平日(月~金)毎日ですか? 銀行/政府の祝日はどうなりますか? 宗教上の祝日?