我有一个表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
^
有人能指出我正确的方向吗?谢谢。
答案 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解释器加载到同一进程中并支持类型转换: