在 KDB 中将时间戳列转换为 Python 日期时间格式

Cast timestamp column to Python datetime format in KDB

我有一个 table tbl,其中列 datetime 采用 KDB 的 timestamp 格式,看起来像 2014.11.22D17:43:40.123456789。我想将其转换为 Python 日期时间格式,例如 2014-11-22 17:43:40.123456789 但我在使用 update 命令时遇到问题。

我知道我可以这样做来投射时间戳:

q)`year`dd`mm`hh`uu`ss15.10.28D03:55:58 // this gives 2015 28 10 3 55 58i

我知道我可以从 datetime 创建一个新列 datetime2,方法是将其作为字符串读取,然后将其转换为整数,在这种情况下:

q)update datetime2:"I"$string datetime from tbl

但是我很难同时投射和更新:

q)update datetime2:`year-`dd-`mm `hh:`uu:`ss$datetime from tbl

我得到的错误是:

evaluation error:

length

  [0]  update datetime2:`year-`dd-`mm `hh:`uu:`ss$datetime from tbl
                                                 ^

谁能指出我正确的方向?谢谢。

Kdb 没有显示时间戳的替代方法,获得所需内容的唯一方法是将时间戳串起来并操作各个字符。类似于:

q)tbl:([]datetime:5#2014.11.22D17:43:40.123456789)
q)update{" "sv'(ssr[;".";"-"];::)@'/:"D"vs'string x}datetime from tbl
datetime
-------------------------------
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"

这纯粹是装饰性的,这些时间戳在时间序列意义上无法使用,但也许它们适合您的目的。

你最终想解决什么问题?如果您尝试将数据传递给 python,您最好使用基础数值并将数值转换回 python 端的时间戳。

您可以使用 https://code.kx.com/analyst/libraries/date-parser/

中的 qdate
q).qdate.print["%Y-%m-%d %H:%M:%S.%N"; 2014.11.22D17:43:40.123456789]
"2014-11-22 17:43:40.123456789"

如果您打算将数据读入 python 文件,那么最好在您的更新语句中将日期转换为 long,它表示纪元之后的纳秒数:

update datetime2:`long$datetime from tbl

然后将长整数转换回 python 文件中的 python 日期时间,否则您可以将其转换为 table 中的字符串,然后更改各个字符以放入它采用 python 日期时间形式(只有数据保存在 kdb 中才有意义)

另一种方法是使用 PyQ 或 embedpy 库,它们将 python 和 q 解释器加载到同一个进程中并支持类型转换:

https://pythonhosted.org/pyq/

https://github.com/KxSystems/embedPy