R中的POSIXct微秒不一致

时间:2013-02-04 11:55:36

标签: r xts posixct

  

可能重复:
  How R formats POSIXct with fractional seconds

我熟悉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

这背后的理性如下:如果我正在从文件中读取时间条目,进行一些处理,再次写入文件,再次读取等,我会收到累积的错误。所以 - 这不是一个“技巧”问题,但实际上是在经过数小时的调试之后......

2 个答案:

答案 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"