在 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 解释器加载到同一个进程中并支持类型转换:
我有一个 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 解释器加载到同一个进程中并支持类型转换: