【问题标题】:Convert Serial number to Date in q/ KDB and update to new column在 q/KDB 中将序列号转换为日期并更新到新列
【发布时间】:2021-12-05 18:39:40
【问题描述】:

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

Class RIC Tenor Product
OTC AAAA "42088" Bond:Bonds:Sovin
OTC ASD "42095" Bond:Bonds:Sovin
OTC AABP "5M" Certified
OTC DBSF "1M" Certified

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

Class RIC Tenor Product EndDate
OTC AAAA "" Bond:Bonds:Sovin 2015.03.26
OTC ASD "" Bond:Bonds:Sovin 2015.01.04
OTC AABP "5M" Certified 0Nd
OTC DBSF "1M" Certified 0Nd

【问题讨论】:

  • 42088 如何映射到 2015.03.26,而 42095(更大)映射到 2015.01.04(更早的日期)?

标签: kdb


【解决方案1】:

您预期输出中的日期是否正确?看起来 Tenor 字符串表示自 1899.12.31 以来的天数。如果是这样,这是获得结果的一种方法:

q)update EndDate:1899.12.31+"I"$Tenor from t where Product like"Bond:Bonds*"
class ric  Tenor   Product          EndDate
----------------------------------------------
OTC   AAA  "42088" Bond:Bonds:Sovin 2015.03.26
OTC   ASD  "42095" Bond:Bonds:Sovin 2015.04.02
OTC   AABP "5M"    Certified
OTC   DBSF "1M"    Certified

【讨论】:

  • KDB 的 Excel 偏移时间为 1899.12.30 并且还有其他条件,即与 "Bond:Bonds:*" 不同的产品也应更新为空,即前面提到的 ""问题表。尝试在单个查询中应用两者。
【解决方案2】:

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"

编辑:使“Bond:Bonds*”的期限为空:

因为 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)

【讨论】:

  • KDB 的 Excel 偏移时间为 1899.12.30 并且还有其他条件,即与“Bond:Bonds:*”不同的产品也应更新为空,即在问题表中提到.尝试在单个查询中应用两者。
  • endDate 中的空单元格应该用 0Nd 填充,而不是像“Bond:Bonds:*”这样的产品。尝试使用上述查询更新相同内容,但仍显示为空单元格。我在哪里做错了?
【解决方案3】:

update endDate:count[i]#enlist 0Nd from t where not Product like "Bond:Bonds*"

您可以尝试更新相同的

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2012-11-30
  • 2023-03-14
  • 2020-08-24
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多