Как разобрать строку в формате "дд / мм / гггг" по типу даты в q kdb? - PullRequest
0 голосов
/ 02 ноября 2018

Как бы вы проанализировали строку даты в формате "дд / мм / гггг", используя q kdb?

Это возможно, когда аргумент месяца является первым "MM / dd / yyyy" следующим образом:

"D"$"1/20/2014"
2014-01-20d

Однако, если день первый "дд / мм / гггг"

"D"$"20/1/2014"
0Nd

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Если вы хотите избежать изменения системных переменных и иметь больший контроль над всеми возможными форматами даты, вы всегда можете написать собственный анализатор даты, например:

f:{"D"$raze"0"^neg[4 2 2]$(y vs z)iasc`YYYY`MM`DD?x}

, который принимает 3 параметра; ожидается формат даты, разделитель и строка даты. Чтобы обработать ваш пример, он будет настроен следующим образом:

q)f[`MM`DD`YYYY;"/";"1/20/2014"]
2014.01.20

Он также может обрабатывать более нетрадиционные форматы дат:

q)f[`MM`YYYY`DD;"p";"1p2014p20"]
2014.01.20

Очевидно, что вышеупомянутое является излишним по сравнению со встроенным анализом даты для вашего примера, но это дает большую степень гибкости.

0 голосов
/ 11 ноября 2018

Обратите внимание, что вам не нужно заполнять нулями (протестировано с 3.3):

q)"." sv ("/" vs "1/20/2014") 2 0 1
"2014.1.20"
q)"D"$ "." sv ("/" vs "1/20/2014") 2 0 1
2014.01.20

В функции:

q)f:{"D"$"."sv("/"vs x)2 0 1}
q)f "1/20/2014"
2014.01.20

Если вам нужна функция, которая может обрабатывать как списки, так и отдельные даты:

q)g:{"D"$$[10=type x;"."sv("/"vs x)2 0 1;"."sv/:("/"vs/:x)[;2 0 1]]}
q)g "7/20/2014"
2014.07.20
q)g ("1/20/2014";"7/20/2014";"03/20/2014")
2014.01.20 2014.07.20 2014.03.20

... что немного лучше, чем each:

q)\ts:100000 g ("1/20/2014";"7/20/2014";"03/20/2014")
308 1168
q)\ts:100000 f each ("1/20/2014";"7/20/2014";"03/20/2014")
327 1312

... и быстрее, чем заполнение / удаление:

q)h:{"D"$raze"0"^neg[4 2 2]$(y vs z)iasc`YYYY`MM`DD?x}[`MM`DD`YYYY;"/";]
q)\ts:100000 h each ("1/20/2014";"7/20/2014";"03/20/2014")
615 1312
0 голосов
/ 02 ноября 2018

KDB поддерживает разбор различных форматов даты и времени. Проверьте детали здесь: https://code.kx.com/q/ref/casting/#tok

В вашем случае вам нужно установить опцию 'z', которая определяет формат для разбора даты.

0 - «мм / дд / гггг», а 1 - «дд / мм / гггг».

Детали: https://code.kx.com/q/ref/syscmds/#z-date-parsing

Вот как вы делаете это для вашего примера:

 q) \z 1
 q) "D"$"20/1/2014"
 q) 2014.01.20
...