【发布时间】:2018-05-29 21:36:20
【问题描述】:
我想以毫秒为单位逐行计算时间戳的差异。下面示例中的差异 (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()
【问题讨论】:
-
timeNewDf %>% mutate(time_diff = round(c(diff(time),0),1))为我工作。 -
漂亮,谢谢!!这几乎太容易了;)结果是正确的,但时间戳仍然不是真的。
timeNew的前两个元素应该是 2018-05-30 09:34:50.6 GMT 和 2018-05-30 09:34:50.8 GMT.. 但是它们是 2018-05-30 09:34:50.5 GMT 和 2018-05-30 09:34:50.7 GMT。我想它的 0.5999999 和 0.7999999 毫秒。 -
是的浮点问题,而不是:
timeNew <- time + (ms/1000)使用这个:timeNew <- strptime(strftime(time + (ms/1000) , format="%H:%M:%OS"),format="%H:%M:%OS") -
但这只是格式化时间,所以我看到更多的浮点数。但是毫秒仍然是 0.599999 而不是 0.6?
-
确实如此。添加偏移量。您可以尝试更高的偏移量,并且仍然显示到 1 毫秒数字。添加了答案。
标签: r floating-point division milliseconds