Значения даты в бине по месяцам из импортированного CSV в KDB? - PullRequest
2 голосов
/ 31 мая 2019

У меня есть файл .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 Ответ

4 голосов
/ 31 мая 2019

Чтобы применить типы при чтении в 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 со списком дат в качестве разделителей сегментов. Это даст целочисленное значение, указывающее, в какую корзину попадает каждая дата, затем вы можете использовать словарь для именования сегментов:

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
...