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

时间:2018-11-02 14:18:04

标签: kdb

您将如何使用q kdb解析格式为“ dd / MM / yyyy”的日期字符串?

当month参数的第一个“ MM / dd / yyyy”如下时,可能是这样的:

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

但是如果日期是第一个“ dd / MM / yyyy”

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

显然,与您的示例中的内置日期解析相比,以上内容是过大的了,但是它确实提供了更大的灵活性。

答案 2 :(得分:2)

请注意,您不必用零填充(已通过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

...并且比填充/整理更快:

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