KDB string to kdb `timestamp`

Viewed 471

kdb mortals/gods!!

I have an array of datetime string but in a different format

> leads[`firstConversion]
"Wed May 20 2020 08:56:54 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:57 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:58 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:58 GMT-0700 (PDT)"
"Wed May 20 2020 08:56:59 GMT-0700 (PDT)"
"Wed May 20 2020 08:57:00 GMT-0700 (PDT)"
"Wed May 20 2020 08:57:01 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:32 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:32 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:33 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:33 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:35 GMT-0700 (PDT)"
"Wed May 20 2020 09:06:35 GMT-0700 (PDT)"
"Wed May 20 2020 09:07:07 GMT-0700 (PDT)"
"Wed May 20 2020 09:07:09 GMT-0700 (PDT)"
"Wed May 20 2020 09:07:09 GMT-0700 (PDT)"
"Wed May 20 2020 09:07:10 GMT-0700 (PDT)"

what would be the best way to convert them into native kdb timestamp 2020.05.20D09:07:10.0000?

3 Answers

Depending on how predictable/consistent the indices of the relevant part of each string is.. something like the below

q)x!"P"$4_'x
"Wed May 20 2020 08:56:54 GMT-0700 (PDT)"| 2020.05.20D08:56:54.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:57 GMT-0700 (PDT)"| 2020.05.20D08:56:57.000000000
q)
q)// or
q)
q)i:4+til -4+count first x
q)x!"P"$x[;i]
"Wed May 20 2020 08:56:54 GMT-0700 (PDT)"| 2020.05.20D08:56:54.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:56 GMT-0700 (PDT)"| 2020.05.20D08:56:56.000000000
"Wed May 20 2020 08:56:57 GMT-0700 (PDT)"| 2020.05.20D08:56:57.000000000
q)
q)x:2000000#x
q)
q)\ts "P"$4_'x
495 161554832
q)\ts "P"$x[;i]
538 161554768

You could use the .qdate library https://code.kx.com/developer/libraries/date-parser/

It can parse to UTC or leave in original timezone:

q).qdate.resolve["%a %b %d %Y %T    %z"] "Wed May 20 2020 09:07:10 GMT-0700 (PDT)"
2020.05.20D16:07:10.000000000
q).qdate.resolve["%a %b %d %Y %T"] "Wed May 20 2020 09:07:10 GMT-0700 (PDT)"
2020.05.20D09:07:10.000000000

Here's one way:

q)t:("Wed May 20 2020 09:07:09 GMT-0700 (PDT)";"Wed May 20 2020 09:07:10 GMT-0700 (PDT)");
q)update stamp:"P"$" "0:(date;month;year;time) from flip `month`date`year`time!(" SIIT";" ")0:t
month date year time         stamp
----------------------------------------------------------
May   20   2020 09:07:09.000 2020.05.20D09:07:09.000000000
May   20   2020 09:07:10.000 2020.05.20D09:07:10.000000000
Related