我熟悉this question about "How R formats POSIXct with fractional seconds"。关于POSIXct在处理微秒时是否有数字错误的问题就在那里。
在我重新实现一整套xts功能之前,这些功能可以在没有错误的情况下进行微秒处理(xts没有任何问题 - 只需它需要POSIXct),我只是想确保:
为什么以下行的输出是4.577894?
as.POSIXlt(as.POSIXct(sprintf("%s",(format(as.POSIXct("2012-12-14 15:42:04.577895 EDT"), "%Y-%m-%d %H:%M:%OS6")))))$sec
非常感谢!
EDIT
这背后的理性如下:如果我正在从文件中读取时间条目,进行一些处理,再次写入文件,再次读取等,我会收到累积的错误。所以 - 这不是一个“技巧”问题,但实际上是在经过数小时的调试之后......
答案 0 :(得分:3)
这个问题已经持续太久了 - 特别是考虑到问题本身与答案有关。
这是输出表示问题,并且是众所周知的。舍入时间值具有影响。在某些情况下,您不能只是舍入亚秒值而不会得到不正确的结果。
解决方案在这里(在问题中链接):How R formats POSIXct with fractional seconds
直接从Aaron的优秀答案中偷窃:
myformat.POSIXct <- function(x, digits=0) {
x2 <- round(unclass(x), digits)
attributes(x2) <- attributes(x)
x <- as.POSIXlt(x2)
x$sec <- round(x$sec, digits)
format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}
x <- as.POSIXct("2012-12-14 15:42:04.577895 EDT")
你在尝试什么:
as.POSIXlt(as.POSIXct(sprintf("%s",(format(x, "%Y-%m-%d %H:%M:%OS6")))))$sec
## [1] 4.577894
亚伦的代码:
myformat.POSIXct(x, 6)
## [1] "2012-12-14 15:42:04.577895"
有人可能会考虑使用sprintf
格式字符串%.06f
来格式化亚秒值,但如果值略低于整数,则会失败:
sprintf('%.06f', .9999999)
## [1] "1.000000"
如果将亚秒值向上舍入,则转换为POSIXlt会导致正确的翻转为秒,分钟等。
要向您显示不数据问题:
y <- as.numeric(x)
y
## [1] 1355521324.5778949261
sprintf('%06f', y - floor(y))
## [1] "0.577895"
答案 1 :(得分:0)
我认为您引用的SO问题的评论中注明了您的问题的答案。问题是转换为POSIXct或POSIXlt包含舍入。只需在您的值和转化权利本身添加一个小偏移。
# Original value
format(as.POSIXct("2012-12-14 15:42:04.577895 EDT"), "%Y-%m-%d %H:%M:%OS6")
[1] "2012-12-14 15:42:04.577894"
# Original value + offset
format(as.POSIXlt("2012-12-14 15:42:04.5778951 EDT"), "%Y-%m-%d %H:%M:%OS6")
[1] "2012-12-14 15:42:04.577895"
我建议使用正则表达式来添加偏移量,如下所示:
gsub(" (\\w+)$","1 \\1","2012-12-14 15:42:04.577895 EDT")
[1] "2012-12-14 15:42:04.5778951 EDT"