#r #nanotime
#r #время #временная метка #дата-время-формат #timedelta
Вопрос:
Я работаю в R, и мне нужно изменить временную метку с того, что, по моему мнению, является точностью до наносекунды, либо с точностью до микросекунды, либо с точностью до миллисекунды (я считаю, что это должны быть миллисекунды или только три цифры после десятичной дроби).
"2019-03-02D00:00:12.214841000"
Отчасти сложность в том, что я не думаю, что есть пакет, lubridate
способный справиться с этим. Я не уверен, нужно ли мне использовать регулярное выражение для извлечения секунд, а затем преобразовать наносекунды в миллисекунды. Я открыт для любых предложений.
Кроме того, как вы рекомендуете обращаться с D
? Я думал, что мне следует использовать gsub("D", "-", df$timestamp)
, и, возможно, тогда такой пакет, как lubridate
, мог бы анализировать временную метку даже с точностью до наносекунды?
Ответ №1:
Вы можете использовать библиотеку nanotime
, которая связана с integer64
(действительно высокой точностью с плавающей точкой)
library(nanotime)
x<-nanotime("2019-03-02T00:00:12.214841000 00:00")
Как вы можете видеть, вам нужно изменить D
для T
и добавить 00:00
в конец, но это легко сделать, как показал вам symbolrush.
x<-nanotime(paste0(gsub("D", "T", "2019-03-02D00:00:12.214841000"), " 00:00"))
Подробнее здесь:
Комментарии:
1. Спасибо за ответ. Вы, ребята, все потрясающие.
Ответ №2:
Вы можете использовать as.POSIXct
после gsub("D", " ", x)
:
as.POSIXct(gsub("D", " ", "2019-03-02D00:00:12.214841000"))
Впоследствии вы все равно сможете работать с точностью до миллисекунды:
dt <- as.POSIXct(gsub("D", " ", "2019-03-02D00:00:12.214841000"))
dt
[1] "2019-03-02 00:00:12 CET"
for(i in 1:1000) dt <- dt - 0.001
dt
[1] "2019-03-02 00:00:11 CET"
Если вы хотите отобразить эти миллисекунды, вы можете использовать format
:
format(dt, "%Y-%m-%d %H:%M:%OS3")
[1] "2019-03-02 00:00:11.214"
format(dt - 1E-3, "%Y-%m-%d %H:%M:%OS3")
[1] "2019-03-02 00:00:11.213"
format(dt - 10E-3, "%Y-%m-%d %H:%M:%OS3")
[1] "2019-03-02 00:00:11.204"
Комментарии:
1. Как я мог бы изменить этот код, чтобы, если мне нужны были три цифры точности, он отображался в миллисекундах, например
2019-03-02D00:00:12.214
?2. Спасибо! Фрагмент кода
format(dt, "%Y-%m-%d %H:%M:%OS3")
из вашей правки работает как шарм. Мне было любопытно, для чего нужны дополнительные две строки кода:dt - 1E-3
и10E-3
части. Я взял наносекунды для первых нескольких строк и поместил их в миллисекундный конвертер, а первая строка кода не1E-3
включена. Просто любопытно, что происходит с двумя другими настройками.3. Единственная другая проблема, с которой я сталкиваюсь, заключается в том, что на данный момент это не объект datetime и обрабатывается как символ. Я не уверен, как преобразовать дату в соответствующий объект даты и времени.