2012-07-20 57 views
1

我有一個順序發生順序時使用POSIXct使用子秒的困難。奇怪的行爲與POSIXct/POSIXlt和亞秒級精度

options(digits.secs=6) 
x <- xts(1:10, as.POSIXct("2011-01-21") + c(1:10)/1e3) 

產生以下輸出,爲什麼不是次序?

     [,1] 
2011-01-21 00:00:00.000 1 
2011-01-21 00:00:00.002 2 
2011-01-21 00:00:00.003 3 
2011-01-21 00:00:00.003 4 
2011-01-21 00:00:00.005 5 
2011-01-21 00:00:00.006 6 
2011-01-21 00:00:00.006 7 
2011-01-21 00:00:00.007 8 
2011-01-21 00:00:00.009 9 
2011-01-21 00:00:00.009 10 

我希望同樣的輸出下面的代碼產生

c(1:10)/1e3 
[1] 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.010 
+2

它是[浮點算術問題](http://stackoverflow.com/questions/9787509/r-xts-001-millisecond-in-index)。這些數字不能準確存儲。嘗試'選項(數字= 20); C(1:10)/ 1e3' – GSee 2012-07-20 00:31:49

回答

2

@GSee是正確的,這是一個浮點運算的問題。 Gavin Simpson'sanswer是正確的,它是如何對象打印

R> options(digits=17) 
R> .index(x) 
[1] 1295589600.0009999 1295589600.0020001 1295589600.0030000 1295589600.0039999 
[5] 1295589600.0050001 1295589600.0060000 1295589600.0070000 1295589600.0079999 
[9] 1295589600.0090001 1295589600.0100000 

所有的精度是存在的,但在format.POSIXlt原因options(digits.secs=6)這些線路不能兌現。

np <- getOption("digits.secs") 
if (is.null(np)) 
    np <- 0L 
else 
    np <- min(6L, np) 
if (np >= 1L) { 
    for (i in seq_len(np) - 1L) { 
    if (all(abs(secs - round(secs, i)) < 1e-06)) { 
     np <- i 
     break 
    } 
    } 
} 

由於精度的問題,在你的例子np在上述for循環復位到3。格式"%Y-%m-%d %H:%M:%OS3"會生成您發佈的時間。如果您使用"%Y-%m-%d %H:%M:%OS6"格式,則可以看到時間準確無誤。

R> format(as.POSIXlt(index(x)[1:2]), "%Y-%m-%d %H:%M:%OS3") 
[1] "2011-01-21 00:00:00.000" "2011-01-21 00:00:00.002" 
R> format(as.POSIXlt(index(x)[1:2]), "%Y-%m-%d %H:%M:%OS6") 
[1] "2011-01-21 00:00:00.000999" "2011-01-21 00:00:00.002000"