如何获得 KDB/Q 中的第一天?

How to get first day of year in KDB/Q?

我正在寻找有效的函数来获取 Q 中的第一天。例如 2017.05.10 -> 2017.01.012016.08.19 -> 2016.01.01

下一个片段有效,但效率不高

{"D"$(string `year$x),".01.01"} .z.d

对于"d"的部分范围:

q)"d"$ceiling 365.245*-2000+`year$.z.Z
2017.01.01

(日期是从 y2k 算起的天数)

此类计算中的一个常见技巧是利用与日期不同的事实,月份非常有规律:每年恰好有 12 个月。因此,要找到一年中的第一天,我们首先将日期转换为月份类型,然后将其四舍五入为 12 的倍数并转换回日期类型:

q)f:"d" xbar"m"$
q)f .z.d
2017.01.01

或与 OP 的日期:

q)f 2017.05.10 2016.08.19
2017.01.01 2016.01.01

只是为了在混音中加入另一种变体:

q){.Q.addmonths[x;1-`mm$x]+1-`dd$x} .z.d
2017.01.01

另一种解决方案:

{"d"+(-).`month`mm$x}.z.d
2017.01.01