Преобразование даты / месяца в письменную форму kdb - PullRequest
0 голосов
/ 21 февраля 2020

Предполагается преобразовать приведенный ниже столбец выходных дней из даты в письменную форму в KDB / Q

t:flip (`contra`weekend`PnL)!(4#`abc;("2020.01.10";"2020.02.17";"2020.03.24";"2020.03.31");-222j, 844j, 1897j, 947j)

Результат должен быть обновлен до

2020.01.10 - Jan-10

2020.02.17 - 17 февраля

2020.03.24 - 24 марта

Заранее благодарим за помощь

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Другой вариант - использовать библиотеку разбора даты, доступную как часть Kx Developer: https://code.kx.com/developer/libraries/date-parser/#printing -dates

Эта библиотека предоставляет ряд утилит для разбора дат и времени из строк. и форматирование их в виде строк из kdb + datatypes

После настройки использование выглядит примерно так (первые несколько команд настраивают env для библиотек для работы и загрузки их в сеансе aq - это также можно сделать с помощью \l):

jonny@kodiak ~ $ source ~/developer/config/config.profile
jonny@kodiak ~ $ export AXLIBRARIES_HOME=~/developer/
jonny@kodiak ~ $ q $AXLIBRARIES_HOME/ws/axruntimecore.q_ 
KDB+ 3.6 2018.12.06 Copyright (C) 1993-2018 Kx Systems
l64/ 4(16)core 7360MB jonny kodiak 127.0.1.1 EXPIRE 2020.06.04 jonathon.mcmurray@aquaq.co.uk KOD #4165225

q)t:flip (`contra`weekend`PnL)!(4#`abc;("2020.01.10";"2020.02.17";"2020.03.24";"2020.03.31");-222j, 844j, 1897j, 947j)
q)update .qdate.print["%b-%d";"D"$weekend] from t
contra weekend  PnL 
--------------------
abc    "Jan-10" -222
abc    "Feb-17" 844 
abc    "Mar-24" 1897
abc    "Mar-31" 947 
q)

Обратите внимание, что мне пришлось проанализировать строковые даты в вашей таблице примеров в kdb + даты с "D"$, так как библиотека qdate ожидает типы kdb + date / time.

1 голос
/ 21 февраля 2020

Как насчет

q)show m:("Jan";"Feb";"Mar")
"Jan"
"Feb"
"Mar"
q)exec {" - "sv/:flip(x;"-"sv'flip(m mod["m"$"D"$x;12];x[;8 9]))}weekend from t

"2020.01.10 - Jan-10"
"2020.02.17 - Feb-17"
"2020.03.24 - Mar-24"
"2020.03.31 - Mar-31"

или если столбец должен оставаться в таблице

q)update {" - "sv/:flip(x;"-"sv'flip(m mod["m"$"D"$x;12];x[;8 9]))}weekend from t

contra weekend               PnL
---------------------------------
abc    "2020.01.10 - Jan-10" -222
abc    "2020.02.17 - Feb-17" 844
abc    "2020.03.24 - Mar-24" 1897
abc    "2020.03.31 - Mar-31" 947

Когда речь идет о манипулировании строками в KDB, vs (вектор из скаляра) и его обратные sv (скаляр от вектора) обычно очень полезны
В приведенном выше примере сначала создайте список возможных месяцев m (я сделал 3 для начала)
Далее, внутри лямбды для краткости можно выделить день с помощью индексации
Затем найти правильный месяц, используя комбинацию приведения и встроенного оператора mod для индексации в списке месяцев
Используйте sv для присоединения к этим спискам с "-" и повторите процесс снова, чтобы присоединиться к нашему начальному столбцу weekend (на этот раз с "-")

1 голос
/ 21 февраля 2020

Следующий код должен помочь

monthDay:{ ("Jan"; "Feb"; "Mar"; "Apr"; "May"; "Jun"; "Jul";
            "Aug"; "Sep"; "Oct"; "Nov"; "Dec")[(`mm$x)-1],'"-",'string `dd$x:"D"$x }

update weekend:(weekend,'" - ",/:monthDay weekend) from `t
0 голосов
/ 21 февраля 2020

Хотя я бы предпочел метод Игоря, вам может быть полезно знать, что системные команды могут использоваться из консоли q, что может предложить вам большую гибкость при выборе нужного формата. Например, может использоваться в этом случае:

conv:{"-"^6#4_first system"date -d ", "/" sv "." vs x}
update conv'[weekend] from t

edit: для вашего точного вывода: update (weekend,'" - ",/: conv'[weekend]) from t

...