我正在使用一个函数(在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}}。每当我传递b
,string
,numpy.string_
或byte
时,它都会抛出numpy.bytes_
。
kdb中这个'type exception
参数是什么类型的,我应该使用什么numpy / qPython类型来传递它?
提前致谢!
答案 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