如何获得 KDB/Q 中的第一天?
How to get first day of year in KDB/Q?
我正在寻找有效的函数来获取 Q 中的第一天。例如 2017.05.10 -> 2017.01.01
或 2016.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
我正在寻找有效的函数来获取 Q 中的第一天。例如 2017.05.10 -> 2017.01.01
或 2016.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