Расчет разницы во времени в миллисекундах - PullRequest
0 голосов
/ 30 мая 2018

Я хочу вычислить разность временных меток в миллисекундах.Разница ( time_diff ) в приведенном ниже примере всегда должна быть 0,2 , но я также получаю значения выше и ниже 0,2.

Проблема начинается, когда деление миллисекунд на секунды и / или добавление numeric значений к POSIXct объекту.

Я предполагаю, что это некоторая проблема с плавающей запятой, поэтому я попытался указать величину digits.sec и цифры, округление, усечение, и т. д ... Но проблема остается.

Почему именно это и как решить эту проблему?

library(dplyr)

options("digits.secs"=10)
options(digits = 10)

id <- 1:12
time <- c("9:34:50" , "9:34:50" , "9:34:51" , "9:34:51" , "9:34:51" , "9:34:51" ,
  "9:34:51" , "9:34:52" , "9:34:52" , "9:34:52" , "9:34:52" , "9:34:52")
ms <- c(600,800,0,200,400,600,800,0,200,400,600,800)

time <- as.POSIXct(time, format="%H:%M:%S", tz="GMT")

# Problem begins here
timeNew <- time + (ms/1000)

timeNewDf <- data.frame(id=id,
                      time=timeNew)

timeNewDf %>% dplyr::mutate(
  time_diff = c(diff(time),0)) %>% 
  dplyr::rowwise()

1 Ответ

0 голосов
/ 31 мая 2018

POSIXct будет приближаться к ближайшей с плавающей точкой меньше, чем точное время.Добавьте смещение в соответствии с приближением с плавающей точкой и покажите до 1 цифры миллисекунды.

library(dplyr) 
options("digits.secs"=1)                                        # showing upto 1 digit

# test data
id <- 1:12
time <- c("9:34:50" , "9:34:50" , "9:34:51" , "9:34:51" , "9:34:51" , 
          "9:34:51" , "9:34:51" , "9:34:52" , "9:34:52" , "9:34:52" , "9:34:52" , "9:34:52")
ms <- c(600,800,0,200,400,600,800,0,200,400,600,800)
time <- as.POSIXct(time, format="%H:%M:%S", tz="GMT")

# offset to cater to floating point approximations
timeNew <- time + (ms/1000) + .0001

timeNewDf <- data.frame(id=id, time=timeNew)
timeNewDf %>% mutate(time_diff = round(c(diff(time),0),1))      # rounding to 1 decimal digit

#1   1 2018-05-30 09:34:50.6  0.2 secs
#2   2 2018-05-30 09:34:50.8  0.2 secs
#3   3 2018-05-30 09:34:51.0  0.2 secs
#4   4 2018-05-30 09:34:51.2  0.2 secs
#5   5 2018-05-30 09:34:51.4  0.2 secs
#6   6 2018-05-30 09:34:51.6  0.2 secs
#7   7 2018-05-30 09:34:51.8  0.2 secs
#8   8 2018-05-30 09:34:52.0  0.2 secs
#9   9 2018-05-30 09:34:52.2  0.2 secs
#10 10 2018-05-30 09:34:52.4  0.2 secs
#11 11 2018-05-30 09:34:52.6  0.2 secs
#12 12 2018-05-30 09:34:52.8  0.0 secs
...