如何利用xbar、Q.addmonths[]实现6个月间隔的日期序列生成
按6个月间隔生成日期序列(kdb+)
要实现从起始日期开始按6个月间隔生成日期序列,Q.addmonths是核心工具,结合til或递归逻辑即可完成。xbar因基于固定时长对齐,无法适配月份这种可变时长的间隔(6个月的天数不固定),不适合此类需求,具体实现如下:
1. 生成指定数量的间隔日期
若明确要生成N个包含起始日的日期,直接用til生成索引,乘以6后传入Q.addmonths:
start:2021.02.15; // 生成包含起始日在内的5个日期(间隔4次6个月) seq:Q.addmonths[start; 6*til 5]; // 输出:2021.02.15 2021.08.15 2022.02.15 2022.08.15 2023.02.15
2. 生成到指定结束日期的序列
若需要生成到某个结束日期之前的所有间隔日期,可用递归逻辑避免计算误差:
start:2021.02.15; end:2022.03.01; // 递归生成序列,直到下一个日期超过结束日 genSeq:{ current:Q.addmonths[x;6*y]; $[current>z; (); current, .z.s[x;y+1;z]] }; seq:genSeq[start;0;end]; // 输出:2021.02.15 2021.08.15 2022.02.15
也可先计算最大间隔次数,再用til生成:
// 计算从起始到结束的总月数,取整后除以6得到间隔次数 totalMonths:.Q.month end - .Q.month start; maxSteps:1+floor[totalMonths%6]; seq:Q.addmonths[start; 6*til maxSteps];
注意事项
Q.addmonths会自动处理月末特殊情况:比如2020.02.29加6个月会得到2020.08.29,2021.02.28加6个月会得到2021.08.28- 不要用
xbar处理此类需求:xbar基于固定时长(如天数)对齐,无法适配月份的可变天数,会导致日期偏移错误
内容的提问来源于stack exchange,提问作者Fueled By Coffee
相关产品推荐
相关产品推荐

