Как можно создать строку даты ISO «гггг-ММ-дд» из типа даты Q? Я посмотрел на объединение различных частей, но даже не могу получить день/месяц, например. d:2015.12.01;d.month печатает 2015.12, то есть больше, чем просто месяц.
Как создать отформатированную строку даты в Q/KDB?
Ответы (6)
q)"-" sv "." vs string[2015.12.01]
"2015-12-01"
vs вектор из строки, разбивается на "." выше; sv строка к вектору, соединить знаком "-" выше.
Помните, что строка — это просто массив символов, поэтому вы можете захватывать каждую часть по мере необходимости с помощью индексации. Но приведенное выше полезно, так как результирующий вектор vs дает вектор длины 3, которым вы можете манипулировать так, как вам нравится.
Если вы планируете делать это в большом масштабе (например, большой вектор/список дат или столбец в таблице) и уверены, что ваши даты всегда правильно сформированы, вы можете использовать точечную поправку:
q)update .[;(::;4 7);:;"-"]string date from ([] date:2#.z.D)
date
------------
"2016-01-04"
"2016-01-04"
Таким образом, вам не нужно будет обращаться к «каждой» записи вектора/списка, он работает с самим вектором/списком.
Ознакомьтесь с этой библиотекой 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"
Я считаю, что самый короткий (и самый чистый) вариант для временной метки 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 :(
Я использую что-то вроде этого:
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"
Пожалуйста, измените разделитель, например - или /, в заявлении об обновлении.
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"