什么类型有kdb的xbar时间

时间:2017-08-01 14:00:47

标签: python numpy kdb qpython

我正在使用一个函数(在python中,使用qPython)从kdb中的hdb表中获取历史数据。在参数方面,我想给最终用户这个功能带来尽可能多的自由。函数构建的查询看起来像这样:

select by 10 xbar time.minute from trade where date within('2017-06-31';'2017-07-01'),sym = 'instr1'

这次又是一次,但这次是使用变量占位符:

'{[a:b;x;y;z]select by a xbar b from trade where date within(x;y),sym in z}',

我的问题是代替time.something的{​​{1}}。每当我传递bstringnumpy.string_byte时,它都会抛出numpy.bytes_

kdb中这个'type exception参数是什么类型的,我应该使用什么numpy / qPython类型来传递它?

提前致谢!

2 个答案:

答案 0 :(得分:1)

你可以使用。在这样的选择的函数中的符号,例如

q){select count i by time.minute from x}([]time:2#.z.p)
minute| x
------| -
19:43 | 2

这里的类型错误问题是函数声明:

{[a:b;x;y;z]select by a xbar b from trade where date within(x;y),sym in z}

声明应为

{[a;b;x;y;z]select by a xbar b from trade where date within(x;y),sym in z}

即。你有一个:而不是;

您尝试执行的强制转换的问题是数据将以不同的类型返回,具体取决于您如何投射它。你也无法通过" b"以你想要的方式来实现这个功能。就个人而言,我只会坚持使用时间戳(假设时间是时间戳类型)并使用参数的分辨率来指示它,例如

q){[b;t] select count i by b xbar time from t}[0D01;([]time:0D 0D00:01 0D01+.z.p)]                                                                                                

time                         | x
-----------------------------| -
2017.08.01D19:00:00.000000000| 2
2017.08.01D20:00:00.000000000| 1
q){[b;t] select count i by b xbar time from t}[0D00:01;([]time:0D 0D00:01 0D01+.z.p)]                                                                                             
time                         | x
-----------------------------| -
2017.08.01D19:48:00.000000000| 1
2017.08.01D19:49:00.000000000| 1
2017.08.01D20:48:00.000000000| 1
q){[b;t] select count i by b xbar time from t}[0D00:00:01;([]time:0D 0D00:01 0D01+.z.p)]                                                                                          
time                         | x
-----------------------------| -
2017.08.01D19:48:30.000000000| 1
2017.08.01D19:49:30.000000000| 1
2017.08.01D20:48:30.000000000| 1

至于python类型,不确定,但我认为它是numpy.datetime64

答案 1 :(得分:0)

您可以使用带点符号的任何时间类型;

例如time.dd,time.hh,time.mm,time.month,time.year。

但是函数不支持,所以你应该使用强制转换符号;

select by 10 xbar `minute$time from trade where date within('2017-06-31';'2017-07-01'),sym = 'instr1'

http://code.kx.com/q4m3/2_Basic_Data_Types_Atoms/#257-constituents-and-dot-notation