在R中为时间戳添加毫秒

时间:2015-02-03 15:46:35

标签: r datetime

我的时间戳管理存在问题。在我的数据集中,我有两个变量,即时间和相对时间。时间是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的评论!

1 个答案:

答案 0 :(得分:3)

As explained here(以及@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"