查找日期,省略周末和节假日

Finding dates, omitting weekends and holidays

我正在考虑创建一个避免使用 loops/while 的函数的最佳方法。有任何想法吗?

给定函数原型:

{[sd;n:hols]
/ return list of n number of dates <= SD, excluding weekends and hols 

}

谢谢,节日快乐

您可以使用列表以及 kdb+ 中的日期基于基础整数这一事实:

{[sd;n;hols] d where not[d in hols]&1<mod[d:sd-til n]7}

这使用 til 生成截至今天的日期列表,然后使用 mod 进行过滤,同时检查以确保剩余日期不在假日过滤器中列表,然后使用真实结果索引回生成的日期列表。这些将按降序排列,但您可以使用

{[sd;n;hols] reverse d where not[d in hols]&1<mod[d:sd-til n]7}

日期升序。

另一种解决方案是在计算模数之前排除节假日:

{[sd;n;hols] d where 1<mod[d:except[;hols]sd-til n]7}

除了使用 "except" 排除节假日外,此处的组件与 Ryan 的回答类似。

为了提取正好 n 天,您可以先生成一个更大的列表和return一个正确长度的子列表,例如

{[sd;n;hols] n#d where 1<mod[d:except[;hols]sd-til 2*n]7}

知道 2000.01.01 和 2000.01.02 是星期六和星期日,并且 mod 这些日期是 0 和 1 然后排除 modular 是 0 1 的所有日期我使用:

getBusinessDays:{[Dates;N;Hols] N#(Dates*(Dates mod 7) in 2 3 4 5 6) except 2000.01.01,Hols}

将 return 您输入的前 N ​​个工作日,不包括您选择的节假日。