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

时间:2020-07-13 04:57:41

标签: python datetime kdb

我有一个表tbl,表中的列datetime为KDB的timestamp格式,看起来像2014.11.22D17:43:40.123456789。我想将其转换为类似2014-11-22 17:43:40.123456789这样的Python日期时间格式,但是在使用update命令时遇到了麻烦。

我了解可以执行此操作以投射时间戳:

q)`year`dd`mm`hh`uu`ss$2015.10.28D03:55:58 // this gives 2015 28 10 3 55 58i

我知道我可以通过将datetime2读为字符串然后在这种情况下将其转换为整数来创建新列datetime

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
                                                 ^

有人能指出我正确的方向吗?谢谢。

3 个答案:

答案 0 :(得分:2)

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端的时间戳。

答案 1 :(得分:1)

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

qdate

答案 2 :(得分:1)

如果您打算将数据读取到python文件中,那么最好将日期强制转换为更新语句中的长整数,以表示历元后的纳秒数:

update datetime2:`long$datetime from tbl

,然后在您的python文件中将long转换回python日期时间,否则您可以将其转换为表中的字符串,然后更改各个字符以python datetime形式放置(仅当数据为留在kdb中)

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

https://pythonhosted.org/pyq/

https://github.com/KxSystems/embedPy