什么类型有 kdb 的 xbar 时间
What type has kdb's xbar time
我正在开发一个函数(在 python 中,使用 qPython)从 kdb 内部的 hdb table 获取历史数据。当涉及到参数时,我想在这个函数中给予最终用户尽可能多的自由。函数构建的查询看起来像这样:
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}',
我的问题是关于代替 b
的 time.something
。每当我传递 string
、numpy.string_
、byte
或 numpy.bytes_
时,它都会抛出 'type exception
.
kdb 中的这个 time.*
参数是什么类型,我应该使用什么 numpy/qPython 类型来传递它?
提前致谢!
您可以使用带点符号的任何时间类型;
例如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
您可以使用 .像这样选择的函数中的符号,例如
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
我正在开发一个函数(在 python 中,使用 qPython)从 kdb 内部的 hdb table 获取历史数据。当涉及到参数时,我想在这个函数中给予最终用户尽可能多的自由。函数构建的查询看起来像这样:
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}',
我的问题是关于代替 b
的 time.something
。每当我传递 string
、numpy.string_
、byte
或 numpy.bytes_
时,它都会抛出 'type exception
.
kdb 中的这个 time.*
参数是什么类型,我应该使用什么 numpy/qPython 类型来传递它?
提前致谢!
您可以使用带点符号的任何时间类型;
例如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
您可以使用 .像这样选择的函数中的符号,例如
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