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

时间:2018-02-05 17:18:23

标签: 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    shares    divisor
2017.01.01    AAPL   500       2
2017.01.01    GOOG   100       1
2017.01.02    AAPL   200       2

我需要追加来自" info"基于日期的每个股票代码的股票和除数值。我怎样才能做到这一点?以下是一个例子:

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

3 个答案:

答案 0 :(得分:1)

如果根据确切日期匹配,则可以使用lj。要实现此目的,您需要在data表格中创建一个日期列,并在infodate后设置sym键。像这样:

(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

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

答案 1 :(得分:1)

使用阶梯属性[http://code.kx.com/q/cookbook/temporal-data/#stepped-attribute]

可能对您有用

这将允许您拥有,例如从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

请注意GOOG2017.01.02的空值。使用阶梯属性:

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

上没有新值

答案 2 :(得分:1)

也可以使用aj。

cognitoUser.authenticateUser()