我的时间戳管理存在问题.在我的数据集中,我有两个变量,即时间和相对时间.时间是HH:MM:SS.ss格式,而相对时间是数字变量,包含从0开始经过的秒数(即0.76,1.28,1.78,2.38 ......).为简单起见,让我们考虑一下假设情况:
Time <- c("09:33:23.00", "09:35:25.00", "09:36:26.00")
RTime <- c(0.78, 1.28, 3.98)
然后我执行以下操作来添加毫秒时间:
ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2")
我希望它能产生:
"09:33:23.78" "09:35:25.28" "09:36:26.98"
但我得到以下结果:
"09:33:23.77" "09:35:25.27" "09:36:26.98"
大部分时间它只有一毫秒.我不明白为什么这样做.我可以在strptime函数中添加0.01 ,即(RTime %% 1) + 0.01.但是我没有发现那么优雅,更重要的是,正如你在上面的例子中看到的那样,它并不总是0.01关 - 就像最后一例一样.有关正在发生的事情的任何提示,或者可能是改进代码的建议?
干杯
[求助]
编辑:感兴趣.这就是我最终解决问题的方法:
ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1)+0.005,format="%H:%M:%OS2")
这会"强制"舍入而不是截断,这导致了毫秒的差异.
感谢@Josh O'Brien和@nrussell的评论!
正如这里所解释的(以及上面评论中的@nrussel),这是由strftime()机器对小数秒的稍微不精确的浮点表示的截断(不是四舍五入!)引起的。
作为一个可能有点笨拙的修复,您可以编写一个小型打印函数,在打印之前为每个时间值添加一个非常小的值(.Machine$double.eps大于但小于) 。.01
strftime2 <- function(x, ...) {
strftime(x + 1e-6, ...)
}
## Compare results
strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2")
# [1] "09:33:23.77" "09:35:25.27" "09:36:26.98"
strftime2(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2")
# [1] "09:33:23.78" "09:35:25.28" "09:36:26.98"
Run Code Online (Sandbox Code Playgroud)