我想逐行计算时间戳的差异,以毫秒为单位。 下面示例中的差异( 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()
答案 0 :(得分:1)
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