您将如何使用q kdb解析格式为“ dd / MM / yyyy”的日期字符串?
当month参数的第一个“ MM / dd / yyyy”如下时,可能是这样的:
"D"$"1/20/2014"
2014-01-20d
但是如果日期是第一个“ dd / MM / yyyy”
"D"$"20/1/2014"
0Nd
答案 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