如何在q/KDB中将序列号转换为日期并更新至新增列
实现方案
首先明确转换逻辑前提:你给出的序列号为Excel 1900日期系统的序列号,若你给出的42095需对应2015.01.04,调整下方代码里的日期偏移量即可适配你的序列号基准,核心处理逻辑不变。
假设你的原表名为t,具体实现代码如下:
// EndDate存储为date类型(默认显示格式为YYYY.MM.DD) t: update EndDate:?[Product like "Bond:Bonds*"; `date$ (long Tenor) - 36527; 0Nd], Tenor:?[Product like "Bond:Bonds*"; `; Tenor] from t
如果要求EndDate存储为YYYY.MM.DD格式的字符串而非原生date类型,调整为以下代码:
// EndDate存储为字符串格式 t: update EndDate:?[Product like "Bond:Bonds*"; string `date$ (long Tenor) - 36527; string 0Nd], Tenor:?[Product like "Bond:Bonds*"; ""; Tenor] from t
代码说明
- 用q原生三元运算符
?按Product匹配结果做分支处理,性能远优于逐行判断 Product like "Bond:Bonds*"实现前缀匹配,完全符合你给出的匹配规则- 匹配成功的债券类行:将Tenor列的字符串序列号转成long类型后,按基准偏移转成目标格式,同时将Tenor设为对应类型的空值(可根据原Tenor列的类型选择用
`还是"") - 匹配失败的非债券类行:EndDate直接设为date类型空值0Nd,Tenor保留原有值不变
测试验证
你可以用你给出的示例数据构造测试表校验结果:
// 构造测试表 t:([] Class:`ClassA`ClassB`ClassC`ClassD; RIC:`RIC1`RIC2`RIC3`RIC4; Tenor:"42088" "42095" "5M" "1M"; Product:("Bond:Bonds Government";"Bond:Bonds Corporate";"FX:Forward";"IR:Swap")) // 执行更新 t: update EndDate:?[Product like "Bond:Bonds*"; `date$ (long Tenor) - 36527; 0Nd], Tenor:?[Product like "Bond:Bonds*"; `; Tenor] from t
执行后前两行的EndDate分别为2015.03.26、2015.04.02,后两行EndDate为0Nd,Tenor保留5M、1M,符合需求要求。
内容的提问来源于stack exchange,提问作者codeforkdb
相关产品推荐
相关产品推荐

