Как создать отформатированную строку даты в Q/KDB?

Как можно создать строку даты ISO «гггг-ММ-дд» из типа даты Q? Я посмотрел на объединение различных частей, но даже не могу получить день/месяц, например. d:2015.12.01;d.month печатает 2015.12, то есть больше, чем просто месяц.


person ScarletPumpernickel    schedule 04.01.2016    source источник


Ответы (6)


q)"-" sv "." vs string[2015.12.01]
"2015-12-01"

vs вектор из строки, разбивается на "." выше; sv строка к вектору, соединить знаком "-" выше.

Помните, что строка — это просто массив символов, поэтому вы можете захватывать каждую часть по мере необходимости с помощью индексации. Но приведенное выше полезно, так как результирующий вектор vs дает вектор длины 3, которым вы можете манипулировать так, как вам нравится.

person Manish Patel    schedule 04.01.2016

Если вы планируете делать это в большом масштабе (например, большой вектор/список дат или столбец в таблице) и уверены, что ваши даты всегда правильно сформированы, вы можете использовать точечную поправку:

q)update .[;(::;4 7);:;"-"]string date from ([] date:2#.z.D)
date
------------
"2016-01-04"
"2016-01-04"

Таким образом, вам не нужно будет обращаться к «каждой» записи вектора/списка, он работает с самим вектором/списком.

person terrylynch    schedule 04.01.2016
comment
Это быстрее, чем принятый ответ и, следовательно, то, что я бы порекомендовал. - person mollmerx; 21.01.2016

Ознакомьтесь с этой библиотекой GitHub для форматирования даты и времени. Он поддерживает способ форматирования даты и времени Excel. Это может не подходить для форматирования большого количества объектов.

q).dtf.format["yyyy-mm-dd"; 2018.06.08T01:02:03.456]  
"2018-06-08"

форматирование времени:

q).dtf.format["yyyy-mmmm-dd hh:uu AM/PM"; 2018.01.08T01:02:03.456]  
"2018-January-08 01:02 AM"
person nyi    schedule 22.08.2018

Я считаю, что самый короткий (и самый чистый) вариант для временной метки ISO8601 UTC, доступный, поскольку по крайней мере kdb v3.4 будет использовать .h.iso8601 встроенный

i.e.

q).h.iso8601 .z.p
"2020-11-09T15:42:19.292301000"

Или, если вам просто нужны миллисекунды, подобные тому, что делает JS toISOString(), используйте:

q).isotime:{(23#.h.iso8601 x),"Z"}
q).isotime[.z.p]
"2020-11-09T16:02:02.601Z"
q).isotime[2015.12.01]
"2015-12-01T00:00:00.000Z"

Примечание .z.p важно, так как .h.iso8601 .z.P автоматически выдаст вам местное время без часового пояса (+0100 и т. д.), поэтому оно все равно будет интерпретироваться как UTC синтаксическим анализатором, совместимым с ISO8601 :(

person wizzard0    schedule 09.11.2020

Я использую что-то вроде этого:

q)ymd:{[x;s](4#d),s,(2#-5#d),s,-2#d:string[x]}
q)ymd[.z.D;"-"]
"2016-01-25"
q)ymd[.z.D;"/"]
"2016/01/25"
q)ymd[.z.D;""]
"20160125"

Или для таблиц:

q)t:([]a:5#1;5#.z.d)
q)update s:ymd[;"-"] each d from t
a d          s
-------------------------
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
1 2016.01.26 "2016-01-26"
person sashk    schedule 26.01.2016

Пожалуйста, измените разделитель, например - или /, в заявлении об обновлении.

update s:{ssr[string x;".";y]}'[d;"-"] from ([]a:5#1;5?.z.d)
a d          s
-------------------------
1 2010.12.31 "2010-12-31"
1 2012.08.24 "2012-08-24"
1 2004.12.05 "2004-12-05"
1 2000.10.02 "2000-10-02"
1 2006.09.10 "2006-09-10"
person Deepak    schedule 07.07.2017