Преобразование столбца timestamp в формат Python datetime в KDB - PullRequest
1 голос
/ 13 июля 2020

У меня есть таблица tbl со столбцом datetime в формате KDB timestamp, который выглядит как 2014.11.22D17:43:40.123456789. Я хотел бы преобразовать это в формат Python datetime, например, 2014-11-22 17:43:40.123456789, но у меня проблемы с использованием команды update.

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

q)`year`dd`mm`hh`uu`ss$2015.10.28D03:55:58 // this gives 2015 28 10 3 55 58i

И я понимаю, что могу создать новый столбец datetime2 из datetime, прочитав его как строку, а затем преобразовав в целое число в этом случае:

q)update datetime2:"I"$string datetime from tbl

Но я возникли проблемы с преобразованием и обновлением одновременно:

q)update datetime2:`year-`dd-`mm `hh:`uu:`ss$datetime from tbl

Я получил следующую ошибку:

evaluation error:

length

  [0]  update datetime2:`year-`dd-`mm `hh:`uu:`ss$datetime from tbl
                                                 ^

Может ли кто-нибудь указать мне в правильном направлении? Спасибо.

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Kdb не имеет альтернативного метода отображения временных меток, единственный способ получить то, что вы ищете, - это связать временные метки и управлять отдельными символами. Что-то вроде:

q)tbl:([]datetime:5#2014.11.22D17:43:40.123456789)
q)update{" "sv'(ssr[;".";"-"];::)@'/:"D"vs'string x}datetime from tbl
datetime
-------------------------------
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"
"2014-11-22 17:43:40.123456789"

Это чисто cosmeti c, и эти временные метки были бы непригодны для использования в смысле временного ряда, однако, возможно, они подходят для вашей цели.

Какую проблему вы в конечном итоге пытаетесь решить решить? Если вы пытаетесь передать данные в python, возможно, вам лучше поработать с базовыми числовыми значениями и преобразовать числовое значение обратно в метку времени на стороне python.

1 голос
/ 13 июля 2020

, если вы планируете считывать данные в файл python, тогда лучше всего преобразовать даты в long в вашем операторе обновления, которые представляют количество наносекунд после эпохи:

update datetime2:`long$datetime from tbl

, а затем преобразовать longs обратно в python datetimes в вашем python файле, в противном случае вы могли бы преобразовать его в строку в таблице, а затем изменить отдельные символы, чтобы поместить его в форму python datetime (это будет имеет смысл только в том случае, если данные остаются внутри kdb)

другим способом go может быть использование библиотек PyQ или embedpy, которые загружают интерпретаторы python и q в один и тот же процесс и поддерживают преобразование типов:

https://pythonhosted.org/pyq/

https://github.com/KxSystems/embedPy

1 голос
/ 13 июля 2020

Вы можете использовать библиотеку qdate из https://code.kx.com/analyst/libraries/date-parser/

q).qdate.print["%Y-%m-%d %H:%M:%S.%N"; 2014.11.22D17:43:40.123456789]
"2014-11-22 17:43:40.123456789"
...