首页 > 解决方案 > 在 q/KDB 中将序列号转换为日期并更新到新列

问题描述

数据:包含以下列,而期限序列号应通过向相同数据添加新列转换为日期 YYYY.MM.DD

班级 RIC 男高音 产品
场外交易 AAAA “42088” 债券:债券:Sovin
场外交易 自闭症谱系障碍 “42095” 债券:债券:Sovin
场外交易 AABP “5M” 认证
场外交易 DBSF “1M” 认证

更改后,它应该看起来像“Bond:Bonds*”这样的产品 - 新列将包含当前在“期限”列中的值,但日期格式不是像“Bond:Bonds*”这样的产品 - 新的 EndDate 列将为空

班级 RIC 男高音 产品 结束日期
场外交易 AAAA “” 债券:债券:Sovin 2015.03.26
场外交易 自闭症谱系障碍 “” 债券:债券:Sovin 2015.01.04
场外交易 AABP “5M” 认证 0Nd
场外交易 DBSF “1M” 认证 0Nd

标签: kdb

解决方案


Tenor 看起来是基于 excel 的日期,所以我认为您的预期输出是错误的。

kdb 日期从2000.01.01. 检查excel需要抵消1899.12.30

编辑:您可能需要将确切的偏移量调整到您期望的值,但您知道需要什么

q)update EndDate:1899.12.30+"J"$tenor from t
tenor   EndDate
------------------
"42088" 2015.03.25
"42095" 2015.04.01
"5M"
"1M"

编辑:使“债券:债券*”的期限为空:

因为 Tenor 是一个字符串(即嵌套的字符列表),所以您需要创建一个与 where 返回的长度相同的列表。你可以这样做count[i]#enlist ""

q)update Tenor:count[i]#enlist "", EndDate:1899.12.30+"J"$Tenor from t where Product like "Bond:Bonds*"
Class RIC  Tenor Product          EndDate
--------------------------------------------
OTC   AAAA ""    Bond:Bonds:Sovin 2015.03.25
OTC   ASD  ""    Bond:Bonds:Sovin 2015.04.01
OTC   AABP "5M"  Certified
OTC   DBSF "1M"  Certified
q)

推荐阅读