准确地从字符 - > POSIXct->字符转换为亚毫秒日期时间

sta*_*ant 6 r posixct

我在文件中有一个字符日期时间列.我加载文件(进入a data.table)并执行需要将列转换为的内容POSIXct.然后我需要将POSIXct值写回文件,但日期时间将不相同(因为它打印不正确).

这种打印/格式化问题是众所周知的,并且已经多次讨论过.我读过一些描述这个问题的帖子.我发现的最权威的答案是针对这个问题给出的.该问题的答案提供了两个应该解决此问题的函数(myformat.POSIXctform),但它们似乎不适用于此示例:

x <- "04-Jan-2013 17:22:08.139"
options("digits.secs"=6)
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS3")
[1] "04-Jan-2013 17:22:08.138"
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS4")
[1] "04-Jan-2013 17:22:08.1390"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=3)
[1] "2013-01-04 17:22:08.138"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=4)
[1] "2013-01-04 17:22:08.1390"
Run Code Online (Sandbox Code Playgroud)

我的sessionInfo:

R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C                        
[5] LC_TIME=C                              

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
[1] fasttime_1.0-0   data.table_1.8.9 bit64_0.9-2      bit_1.1-9
[5] sas7bdat_0.3     chron_2.3-43     vimcom_0.9-6    

loaded via a namespace (and not attached):
[1] tools_2.15.2
Run Code Online (Sandbox Code Playgroud)

Aar*_*ica 5

所以我想你确实需要在我的建议中添加一些软糖因素:https : //stackoverflow.com/a/7730759/210673。这似乎有效,但可能包括其他错误;在用于任何重要的事情之前,请仔细测试并考虑它在做什么。

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) + 10^(-digits-1)
  format.POSIXlt(x, paste("%Y-%m-%d %H:%M:%OS",digits,sep=""))
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ler 3

两件事情:

1)@statquant是正确的(而其他知名专家@Joshua Ulrich和@Dirk Eddelbuettel是错误的),@Aaron在他的评论中,但这对于这里的主要问题并不重要:

POSIXlt从设计上来说,在存储时间方面肯定比 更准确POSIXct:由于它的秒总是在 [0, 60) 中,因此它的粒度约为 6e-15,即 6 飞秒,这比 的粒度要小几百万倍POSIXct

然而,这在这里并不是很相关(对于当前的 R):几乎所有操作,尤其是数字操作,都使用 groupOps方法(是的,初学者不知道,但有详细记录),只需看看Ops.POSIXt 哪些确实会浪费额外的精度首先胁迫到POSIXct。此外,format()/print() 在“.”后使用 6 位小数。至多,因此也无法区分 的内部更高精度POSIXlt和 的“仅”100 纳秒粒度POSIXct
(由于上述原因,Dirk和Joshua都导致了他们的错误断言:对于所有简单的实际用途,*lt和*ct的精度是的)。

2)我确实倾向于同意我们(R Core)应该改进 ing format(),从而print()改进这种秒数 POSIXt 对象的 ing(仍然在上面 @Aaron 提到的错误修复之后)。
但我可能是错的,根据“正确”的某种定义,“我们”是对的;-)