如何匹配两个列表中的日期和字符串(KDB)?

如何匹配两个列表中的日期和字符串(KDB)?,kdb,q-lang,Kdb,Q Lang,我有两份清单: data: dt sym bid ask 2017.01.01D05:00:09.140745000 AAPL 101.20 101.30 2017.01.01D05:00:09.284281800 GOOG 801.00 802.00 2017.01.02D05:00:09.824847299 AAPL 101.30 101.40 info: date sym sha

我有两份清单:

data:
dt                             sym    bid    ask
2017.01.01D05:00:09.140745000  AAPL   101.20 101.30
2017.01.01D05:00:09.284281800  GOOG   801.00 802.00
2017.01.02D05:00:09.824847299  AAPL   101.30 101.40

info:
date          sym    shares    divisor
2017.01.01    AAPL   500       2
2017.01.01    GOOG   100       1
2017.01.02    AAPL   200       2
我需要从“信息”中添加基于日期的每个股票代码的份额和除数值。我怎样才能做到这一点?以下是一个例子:

result:
dt                             sym    bid    ask     shares   divisor
2017.01.01D05:00:09.140745000  AAPL   101.20 101.30  500      2
2017.01.01D05:00:09.284281800  GOOG   801.00 802.00  100      1
2017.01.02D05:00:09.824847299  AAPL   101.30 101.40  200      2

如果匹配基于精确的日期匹配,则可以使用。为此,您需要在
data
表中创建一个日期列,并按
date
sym
info
。像这样:

(update date:`date$dt from data)lj 2!info
dt                            sym  price    date       shares divisor
---------------------------------------------------------------------
2018.02.04D17:25:06.658216000 AAPL 103.9275 2018.02.04 500    2
2018.02.04D17:25:06.658216000 GOOG 105.1709 2018.02.04 100    1
2018.02.05D17:25:06.658217000 AAPL 105.1598 2018.02.05 200    2
2018.02.05D17:25:06.658217000 GOOG 104.0666 2018.02.05

然后,您可以从此输出中删除
日期
列。

使用阶梯属性[]

这将允许您在
info
表中记录缺失的日期,并使用“最近”日期(因此您不必每天都有每个sym的数据)。例如,如果没有阶梯属性:

q)data:([] dt:(10?2017.01.01+til 2)+10?.z.t;sym:10?`AAPL`GOOG;bid:100+10?5;ask:105+10?5)
q)info:([] date:2017.01.01 2017.01.01 2017.01.02;sym:`AAPL`GOOG`AAPL;shares:500 100 200;divisor:2 1 2)
q)(update date:`date$dt from data) lj 2!info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2
q)(update date:`date$dt from data) lj `s#2!`sym xasc `sym`date xcols info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02 100    1
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2
注意
2017.01.02
上的
GOOG
的空值。使用阶梯属性:

q)data:([] dt:(10?2017.01.01+til 2)+10?.z.t;sym:10?`AAPL`GOOG;bid:100+10?5;ask:105+10?5)
q)info:([] date:2017.01.01 2017.01.01 2017.01.02;sym:`AAPL`GOOG`AAPL;shares:500 100 200;divisor:2 1 2)
q)(update date:`date$dt from data) lj 2!info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2
q)(update date:`date$dt from data) lj `s#2!`sym xasc `sym`date xcols info
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.01D04:04:03.440000000 GOOG 104 105 2017.01.01 100    1
2017.01.01D14:00:02.748000000 GOOG 104 105 2017.01.01 100    1
2017.01.02D09:34:52.869000000 GOOG 102 106 2017.01.02 100    1
2017.01.02D16:44:16.648000000 AAPL 100 107 2017.01.02 200    2
2017.01.01D08:48:23.285000000 AAPL 102 108 2017.01.01 500    2
2017.01.02D02:31:11.038000000 AAPL 104 109 2017.01.02 200    2
2017.01.01D05:50:50.463000000 GOOG 104 109 2017.01.01 100    1
2017.01.02D02:13:45.275000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D10:25:30.322000000 AAPL 104 109 2017.01.01 500    2
2017.01.01D14:51:12.687000000 AAPL 103 109 2017.01.01 500    2

这里,
GOOG
获取
2017.01.01
的值,因为
2017.01.02

上没有新的值也可能使用aj

q)aj[`date`sym;update date:`date$dt from data;info]
dt                            sym  bid ask date       shares divisor
--------------------------------------------------------------------
2017.01.02D07:57:14.764000000 GOOG 101 109 2017.01.02 200    2
2017.01.02D02:31:39.330000000 AAPL 100 105 2017.01.02 200    2
2017.01.02D04:25:17.604000000 AAPL 102 107 2017.01.02 200    2
2017.01.01D01:47:51.333000000 GOOG 104 106 2017.01.01 100    1
2017.01.02D15:50:12.140000000 AAPL 101 107 2017.01.02 200    2
2017.01.01D02:59:16.636000000 GOOG 102 106 2017.01.01 100    1
2017.01.01D14:35:31.860000000 AAPL 100 107 2017.01.01 500    2
2017.01.01D16:36:29.214000000 GOOG 101 108 2017.01.01 100    1
2017.01.01D14:01:18.498000000 GOOG 101 107 2017.01.01 100    1
2017.01.02D08:31:52.958000000 AAPL 102 109 2017.01.02 200    2

如果你提供了一个“最小的、完整的、可验证的”例子,人们就更容易测试和提供答案。请参见此处:简而言之,如果您可以提供Q表达式来生成输入表,这将非常有用,例如,使用真实时间戳not
ts0
ETCASUME表不能以不同的方式读取,或者是从一些更好的数据存储中读取,但是如果您可以提供Q表达式来设置表,这将非常有用。e、 g.
数据:([]dt:(10?2017.01.01+til 2)+10?z.t;符号:10?`AAPL`GOOG;投标:100+10?5;ask:105+10?5);信息:([]日期:2017.01.01 2017.01.01 2017.01.02;sym:`AAPL`GOOG`AAPL;股票:500100200;除数:2112)
我想你需要使用
2
要输入
日期
sym
TS,您就是一个传奇。谢谢你们两位。