根据季度 KDB+/Q 的日期范围列出季度和年份

Make a list with the quarter and year based on a date range of quarters KDB+/Q

我有一个由以下函数给出的过去 8 个季度的日期范围列表

q) findLastYQuarters:{reverse("d"$(-3*til y)+m),'-1+"d"$(-3*-1+til y)+m:3 bar"m"$x}[currentDate;8]
q) findLastYQuarters
2020.01.01 2020.03.31
2020.04.01 2020.06.30
2020.07.01 2020.09.30
2020.10.01 2020.12.31
2021.01.01 2021.03.31
2021.04.01 2021.06.30
2021.07.01 2021.09.30
2021.10.01 2021.12.31

我需要生成一个单独的列表,以特定格式标记此列表中的每个项目;第二个列表需要

1Q20,2Q20,3Q20,4Q20,1Q21,2Q21,3Q21,4Q21

此代码需要能够 运行 自己,那么如何将第一个列表作为输入并生成第二个列表?我考虑过将范围内的后一个日期转换为一个月并将其除以 3 以获得季度并提取年份,但我无法弄清楚如何实际实现它。任何建议将不胜感激!

想通了。

crop:findLastYQuarters;
crop[0]:crop[0][1];
crop[1]:crop[1][1];
crop[2]:crop[2][1];
crop[3]:crop[3][1];
crop[4]:crop[4][1];
crop[5]:crop[5][1];
crop[6]:crop[6][1];
crop[7]:crop[7][1];

labels:()
labelingFunc:{[r] temp:("." vs string["m"$r]); labels,((string(("J"$temp[1])%3)),"Q",(temp[0][2,3])};
leblingFunc each crop;
labels

我相信有很多方法可以解决这个问题,像下面定义的 f 这样的函数就可以解决问题:

q)f:{`$string[1+mod[`month$d;12]%3],'"Q",/:string[`year$d:x[;0]][;2 3]}
q)lyq
2020.01.01 2020.03.31
2020.04.01 2020.06.30
2020.07.01 2020.09.30
2020.10.01 2020.12.31
2021.01.01 2021.03.31
2021.04.01 2021.06.30
2021.07.01 2021.09.30
2021.10.01 2021.12.31
q)f lyq
`1Q20`2Q20`3Q20`4Q20`1Q21`2Q21`3Q21`4Q21