KDB - 在单个列中处理多种数据类型
KDB - handling multiple data types in a single column
我有一个数据集,其中包含一列字符串值,我将其作为符号导入。不幸的是,值列是日期、整数或浮点数,具体取决于列 value_type.
中标识的数据类型
我手动创建了 value_type
字段,以便“标记”value
是什么类型的数据,这样我就可以根据需要修改或添加更多数据。
我的目标是将所有这些转换为整数月份,以便我可以从 iStart 生成时间序列数据。 i.e (iEnd: iStart + 0+ til desired_months
) 我已将 desired_months
作为我要根据列 value
中的各种数据生成的列
条件开关在这里似乎很合适,但我无法让它工作。日期解析似乎是最有问题的。我一直在想类似于 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_type
是什么来转换 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}
然后我们可以使用这个字典将原来的table更新为return
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
其中的一个困难是与 value
的不一致。 date
和 date_part
的格式不一致,这意味着可能需要开发更全面的功能以涵盖所有可能性。
我有一个数据集,其中包含一列字符串值,我将其作为符号导入。不幸的是,值列是日期、整数或浮点数,具体取决于列 value_type.
中标识的数据类型我手动创建了 value_type
字段,以便“标记”value
是什么类型的数据,这样我就可以根据需要修改或添加更多数据。
我的目标是将所有这些转换为整数月份,以便我可以从 iStart 生成时间序列数据。 i.e (iEnd: iStart + 0+ til desired_months
) 我已将 desired_months
作为我要根据列 value
条件开关在这里似乎很合适,但我无法让它工作。日期解析似乎是最有问题的。我一直在想类似于 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_type
是什么来转换 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}
然后我们可以使用这个字典将原来的table更新为return
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
其中的一个困难是与 value
的不一致。 date
和 date_part
的格式不一致,这意味着可能需要开发更全面的功能以涵盖所有可能性。