在KDB+中根据对应时区批量转换时间戳至本地时间的问题
KDB+批量转换时间戳至对应时区本地时间解决方案
问题分析
你之前的代码无法批量转换的核心原因是:遍历timeZone列时,函数内引用的timeStamp是整个列向量,导致每个时区都与所有时间戳进行计算,而非对应行的单个时间戳,无法实现一一配对转换。
修正方案
要实现每行时间戳与对应时区的配对转换,需使用KDB+的配对遍历操作('或.each),让dxTZFromGMT逐个处理每行的时区和时间戳组合。
步骤1:修正时区格式(若原始数据存在空格)
KDB+的时区标识符采用下划线分隔(如America/New_York),若你的timeZone列包含空格(如"America/New York"),需先替换为下划线:
table: update timeZone:ssr[;" "; "_"] each timeZone from table
步骤2:批量转换本地时间
使用配对遍历操作,让每个时间戳对应自身行的时区进行转换:
table: update localTime:first each dxTZFromGMT[`$timeZone; timeStamp] from table
或更直观的函数式写法:
table: update localTime:{first dxTZFromGMT[`$x; y]}'[timeZone; timeStamp] from table
代码验证示例
测试数据初始化:
table: ([] timeStamp:3#2022.10.06D08:56:00.508000000; timeZone:("Europe/London";"Australia/Sydney";"America/New York"); localTime:())
执行修正和转换后,localTime列会正确显示对应时区的本地时间:
- 伦敦本地时间:
2022.10.06D08:56:00.508 - 悉尼本地时间:
2022.10.06D18:56:00.508 - 纽约本地时间:
2022.10.06D04:56:00.508
内容的提问来源于stack exchange,提问作者coderinq
相关产品推荐
相关产品推荐

