在KDB中按月从导入的CSV绑定日期值?

时间:2019-05-31 09:07:07

标签: kdb

我有一个带有以下示例架构的.csv文件:

item, date
10,2015.01.01
2,2015.02.01
3,2015.01.15
4,2015.03.01
5,2015.03.01
20,2015.03.01
11,2015.02.01
23,2015.01.21
13,2015.01.31

我正在将项目分类为年/月/日,即2015-01, 2015-02, 2015-03。 我尝试了以下行,因为它似乎不起作用:

select item by 1 xbar date.month from table

还尝试使用新列进行更新:

update column: `mm$date from table

似乎导入.csv文件会将字段强制转换为符号。我是否需要首先将其明确地转换回日期类型?

我如何打印出具有按特定时间/日期条件划分的值的表?

1 个答案:

答案 0 :(得分:3)

要在读取csv时应用类型,请按如下方式使用0:

q)("ID";enlist ",") 0: `:test.csv
item date
---------------
10   2015.01.01
2    2015.02.01
3    2015.01.15
4    2015.03.01
5    2015.03.01
20   2015.03.01
11   2015.02.01
23   2015.01.21
13   2015.01.31

左参数是两个项目列表,"ID"指定每一列的类型(整数,日期),","指定分隔符(enlist指示列标题存在)。

然后可以按月对数据进行存储:

q)select item by 1 xbar `month$date from ("ID";enlist ",") 0: `:test.csv
date   | item
-------| -----------
2015.01| 10 3 23 13i
2015.02| 2 11i
2015.03| 4 5 20i

或者,如果您想要具有自定义大小的存储桶,则可以将bin与日期列表一起用作存储桶分隔符。这将给出一个整数值,指示每个日期属于哪个bin,然后您可以使用字典来命名存储桶:

q)b:2015.01.01 2015.02.01 2015.03.01
q)d:(0 1 2)!`month$b
q)select item by d b bin date from ("ID";enlist ",") 0: `:test.csv
date   | item
-------| -----------
2015.01| 10 3 23 13i
2015.02| 2 11i
2015.03| 4 5 20i

注意:bin将为第一个除法器以下的值分配-1。使用binr将从0开始计数:

q)b bin 2014.12.31
-1
q)b binr 2014.12.31
0