KDB-在一列中处理多个数据类型

KDB-在一列中处理多个数据类型,kdb,Kdb,我有一个数据集,它由一列字符串值组成,我将这些字符串值作为符号导入。不幸的是,值列是日期、整数或浮点值,具体取决于列value\u type中标识的数据类型 我已经手动创建了value\u type字段,以便“标记”什么类型的数据value,以便能够根据需要修改或添加更多数据 我的目标是将所有这些转换为整数月份,这样我就可以从iStart生成时间序列数据即(iEnd:iStart+0+til desired\u months)我已将desired\u months作为我希望基于列值中的各种数据生

我有一个数据集,它由一列字符串值组成,我将这些字符串值作为符号导入。不幸的是,值列是日期、整数或浮点值,具体取决于列value\u type中标识的数据类型

我已经手动创建了
value\u type
字段,以便“标记”什么类型的数据
value
,以便能够根据需要修改或添加更多数据

我的目标是将所有这些转换为整数月份,这样我就可以从iStart生成时间序列数据<代码>即(iEnd:iStart+0+til desired\u months)我已将
desired\u months
作为我希望基于列
值中的各种数据生成的列

有条件的切换在这里似乎是合适的,但我没能让它工作。日期解析似乎是最有问题的。我一直在想类似于
is number=1b
is date=1b
的东西会有帮助

提前感谢您的任何意见

show t;

Symbol  Symbol       Symbol        Symbol            Integer   
id      iStart        value    value_type       desired_months
---|--------------------------------- 
AAA|    2014.08   02/01/2015     date                      6           
BBB|    2014.08   1              month                     1           
CCC|    2014.08   2              year                     24 
DDD|    2014.08   3              months                    3 
EEE|    2014.08   4.5            years                    54 
FFF|    2014.08   2016.01.02     date                     17 
GGG|    2014.08   10/1/2014      date                      2 
HHH|    2014.08   24             months                   24 
III|    2014.08   07/2015        date_part                11 
JJJ|    2014.08   2/16           date_part                18 

解决这个问题的一种方法可能是创建一个函数字典,根据其
val_类型
转换
value
。见下文

q)dict:`date`month`year`date_part!({abs y-"m"$"D"$x};{[x;y]"F"$x};{[x;y]12*"F"$x};{abs y-"M"$"/"sv$[5>count x;("20";"0"),';]reverse"/"vs x})
q)dict
date     | {abs y-"m"$"D"$x}
month    | {[x;y]"F"$x}
year     | {[x;y]12*"F"$x}
date_part| {abs y-"M"$"/"sv$[5>count x;("20";"0"),';]reverse"/"vs x}
然后,我们可以在更新原始表时使用此字典返回

q)update desired_months:`int${[x;y;z;s]get each(x y),'enlist'[z],'s}[dict;val_type;string val;iStart]from t
iStart  val        val_type  desired_months
-------------------------------------------
2014.08 02/01/2015 date      6
2014.08 1          month     1
2014.08 2          year      24
2014.08 3          month     3
2014.08 4.5        year      54
2014.08 2016.01.02 date      17
2014.08 10/1/2014  date      2
2014.08 24         month     24
2014.08 07/2015    date_part 11
2014.08 2/16       date_part 18

这方面的一个困难是
值与
不一致。
date
date\u部分的格式不一致,这意味着可能需要开发更全面的函数来覆盖所有可能的部分。

解决这一问题的一种方法可能是创建一个函数字典,根据其
val\u类型
转换
值。见下文

q)dict:`date`month`year`date_part!({abs y-"m"$"D"$x};{[x;y]"F"$x};{[x;y]12*"F"$x};{abs y-"M"$"/"sv$[5>count x;("20";"0"),';]reverse"/"vs x})
q)dict
date     | {abs y-"m"$"D"$x}
month    | {[x;y]"F"$x}
year     | {[x;y]12*"F"$x}
date_part| {abs y-"M"$"/"sv$[5>count x;("20";"0"),';]reverse"/"vs x}
然后,我们可以在更新原始表时使用此字典返回

q)update desired_months:`int${[x;y;z;s]get each(x y),'enlist'[z],'s}[dict;val_type;string val;iStart]from t
iStart  val        val_type  desired_months
-------------------------------------------
2014.08 02/01/2015 date      6
2014.08 1          month     1
2014.08 2          year      24
2014.08 3          month     3
2014.08 4.5        year      54
2014.08 2016.01.02 date      17
2014.08 10/1/2014  date      2
2014.08 24         month     24
2014.08 07/2015    date_part 11
2014.08 2/16       date_part 18

这方面的一个困难是
值与
不一致。
date
date\u部分的格式不一致,这意味着可能需要开发更全面的功能,以涵盖所有可能的功能。

再次感谢Cathal!我会彻夜沉浸在这上面,并在am中实现它。我想我可以“标记”val_类型,但这确实是令人讨厌的书面文本排列。看起来数据处理是最难的部分。我会在早上工作的时候发回来。今天早上测试过了,再次感谢你。我认为这会很有效!当新的排列出现时,我将能够在字典中加入更多的函数!再次感谢你,国泰航空!我会彻夜沉浸在这上面,并在am中实现它。我想我可以“标记”val_类型,但这确实是令人讨厌的书面文本排列。看起来数据处理是最难的部分。我会在早上工作的时候发回来。今天早上测试过了,再次感谢你。我认为这会很有效!当新的排列出现时,我将能够在字典中加入更多的函数!