Анализ временных меток дельты в R (наносекунды, микросекунды, миллисекунды)

#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"))
 

Подробнее здесь:

http://dirk.eddelbuettel.com/code/nanotime.html

Комментарии:

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 и обрабатывается как символ. Я не уверен, как преобразовать дату в соответствующий объект даты и времени.