你好社区
我再次需要你的帮助和建议。 作为一个新用户,我正在努力学习。
我有一个包含开始日期和结束日期的数据表。 我想计算开始日期和结束日期之间的工作日数? 在 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粗略的答案可能看起来更简单
您需要做的第一件事是定义“工作日”。 是每个工作日(周一至周五)吗? 银行/政府假期怎么样? 宗教节日?