你好社區
我再次需要你的幫助和建議。 作為一個新用戶,我正在努力學習。
我有一個包含開始日期和結束日期的資料表。 我想計算開始日期和結束日期之間的工作日數? 在 JMP 中執行此操作的最佳方法是什麼? 我的想法是添加一列並製作一個公式,例如日期差? 但我不確定什麼是更好的選擇。
請參閱隨附的範例

謝謝
馬丁
嗨傑瑞
這真的很有幫助。 我製作了自己的清單,現在它顯示了我想要的東西。
謝謝
馬丁
你好@Martinej ,
我不久前編寫了一個加載項,用於計算兩個日期列之間的工作日數。 透過維護儲存在載入項目錄中的 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 年新年和聖誕節正好在工作日,因此是 260,而不是 262。 您將來需要更新關聯數組,可能還需要歷史資料。 有些假期並不每年都在同一天。 多麼醜陋的問題,這導致了......
複雜的解決方案可能會使用類似的東西https://www.abstractapi.com/holidays-api
(歸功於@傑夫·珀金森為了變更日期和時間列以僅產生日期。)
是的,工作日是每個工作日,(週一至週五)如果我也可以調整當地假日,那就最好了
有什麼建議麼?
還有其他問題:JMP 日期始終包含時間,通常設定為午夜後零秒。 但如果範圍是週一中午到7天後週一中午,那兩個半週一該怎麼算呢? 或者即使是周一開始時的午夜,兩者都應該被計算在內嗎?
如果您的範圍很小而且不是太多,計算天數可能不是一個壞選擇(以下是經過不良測試的程式碼):
// 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 counted第262章
104 == countSelectedDaysInRange(01Jan2020, 31Dec2020, Expr(!(2 <= 星期幾(日期) <= 6))) = 1;
第366章 == countSelectedDaysInRange(01Jan2020, 31Dec2020, 1) = 1;
0 == countSelectedDaysInRange(01Jan2020, 31Dec2020, 0) = 1;
上面的程式碼包括最後一天(<=lastdate 而不是
從痛苦的經驗中,我知道處理日期和時間是很難做到正確的。
盡可能使用內建函數。
為接下來維護它的人註解程式碼。
仔細測試你的程式碼!
另外,如果您只需要一個粗略的近似值,
(1jan2021-1jan2020)/indays(1)*5/7 == 261.428571428571
這接近 262 的計數。
編輯:日期差異(1jan2020,1jan2021,"日")*5/7粗略的答案看起來更簡單
您需要做的第一件事是定義“工作日”。 是每個工作日(週一至週五)嗎? 銀行/政府假期怎麼樣? 宗教節日?