以毫秒为单位计算时差
Calculating Time Differences in Milliseconds
我想按行计算时间戳的毫秒差。下面示例中的差异 (time_diff) 应始终为 0.2,但我也得到高于和低于 0.2 的值。
当将 毫秒划分为秒and/or 将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()
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
我想按行计算时间戳的毫秒差。下面示例中的差异 (time_diff) 应始终为 0.2,但我也得到高于和低于 0.2 的值。
当将 毫秒划分为秒and/or 将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()
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