我正在尝试创建一个避免使用循环/ while的函数的最佳方法。有任何想法吗?
给定函数原型:
{[sd;n:hols]
/ return list of n number of dates <= SD, excluding weekends and hols
}
谢谢,节日快乐
另一种解决方案是在计算模数之前排除假期:
{[sd;n;hols] d where 1<mod[d:except[;hols]sd-til n]7}
这里的组件类似于Ryan的答案,而不是使用“except”来排除假期。
为了准确提取n天,您最初可以生成更大的列表并返回正确长度的子列表,例如
{[sd;n;hols] n#d where 1<mod[d:except[;hols]sd-til 2*n]7}
您可以使用列表以及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}
要有升序日期顺序。
知道2000.01.01和2000.01.02是星期六和星期日,那些mod的日期是0和1,然后排除所有模块的日期是0 1我用过:
getBusinessDays:{[Dates;N;Hols] N#(Dates*(Dates mod 7) in 2 3 4 5 6) except 2000.01.01,Hols}
将返回您输入的前N个工作日,不包括您选择的假期。