如何将格式为 "dd/MM/yyyy" 的字符串解析为 q kdb 中的日期类型?

How to parse a string in format "dd/MM/yyyy" to date type in q kdb?

如何使用 q kdb 解析 "dd/MM/yyyy" 格式的日期字符串?

当月份参数在第一个"MM/dd/yyyy"时是可能的,如下所示:

"D"$"1/20/2014"
2014-01-20d

但是如果第一天 "dd/MM/yyyy"

"D"$"20/1/2014"
0Nd

KDB 支持解析不同的日期时间格式。在这里查看详细信息: https://code.kx.com/q/ref/casting/#tok

对于您的情况,您需要设置 'z' 选项来指定日期解析的格式。

0 是 "mm/dd/yyyy",1 是 "dd/mm/yyyy"。

详情:https://code.kx.com/q/ref/syscmds/#z-date-parsing

您的示例是这样的:

 q) \z 1
 q) "D"$"20/1/2014"
 q) 2014.01.20

如果您想避免更改系统变量并更好地控制所有可能的日期格式,您可以随时编写自定义日期解析器,例如:

f:{"D"$raze"0"^neg[4 2 2]$(y vs z)iasc`YYYY`MM`DD?x}

需要3个参数;预期的日期格式、分隔符和日期字符串。要处理您的示例,它将设置如下:

q)f[`MM`DD`YYYY;"/";"1/20/2014"]
2014.01.20

它还可以处理更多非常规的日期格式:

q)f[`MM`YYYY`DD;"p";"1p2014p20"]
2014.01.20

显然,与您的示例的内置日期解析相比,以上内容有点矫枉过正,但它确实提供了更大程度的灵活性。

请注意,您不必用零填充(使用 3.3 测试):

q)"." sv ("/" vs "1/20/2014") 2 0 1
"2014.1.20"
q)"D"$ "." sv ("/" vs "1/20/2014") 2 0 1
2014.01.20

在函数中:

q)f:{"D"$"."sv("/"vs x)2 0 1}
q)f "1/20/2014"
2014.01.20

如果您想要一个既能处理列表又能处理单个日期的函数:

q)g:{"D"$$[10=type x;"."sv("/"vs x)2 0 1;"."sv/:("/"vs/:x)[;2 0 1]]}
q)g "7/20/2014"
2014.07.20
q)g ("1/20/2014";"7/20/2014";"03/20/2014")
2014.01.20 2014.07.20 2014.03.20

... 这比使用 each:

好一点
q)\ts:100000 g ("1/20/2014";"7/20/2014";"03/20/2014")
308 1168
q)\ts:100000 f each ("1/20/2014";"7/20/2014";"03/20/2014")
327 1312

...并且比 padding/razing 更快:

q)h:{"D"$raze"0"^neg[4 2 2]$(y vs z)iasc`YYYY`MM`DD?x}[`MM`DD`YYYY;"/";]
q)\ts:100000 h each ("1/20/2014";"7/20/2014";"03/20/2014")
615 1312