将毫秒添加到 R 中的时间戳
Adding milliseconds to Time Stamp in R
我的时间戳管理有问题。在我的数据集中,我有两个变量,即时间和相对时间。时间采用 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 off——就像最后一个例子一样。关于正在发生的事情的任何提示,或者改进代码的建议?
干杯
[已解决]
编辑: 对于感兴趣的人。这就是我最终解决问题的方式:
ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1)+0.005,format="%H:%M:%OS2")
'forces' 舍入而不是截断导致毫秒数的差异。
感谢@Josh O'Brien 和@nrussell 的评论!
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"
我的时间戳管理有问题。在我的数据集中,我有两个变量,即时间和相对时间。时间采用 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 off——就像最后一个例子一样。关于正在发生的事情的任何提示,或者改进代码的建议?
干杯
[已解决]
编辑: 对于感兴趣的人。这就是我最终解决问题的方式:
ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1)+0.005,format="%H:%M:%OS2")
'forces' 舍入而不是截断导致毫秒数的差异。
感谢@Josh O'Brien 和@nrussell 的评论!
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"