2012-07-20 1 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 

내가 동일한 출력 코드는 아래 @GSee이 옳다

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). 이 번호는 정확하게 저장할 수 없습니다. 'options (digits = 20);을 시도하십시오. c (1:10)/1e3' – GSee

답변

2

생산 기대,이 부동 소수점 연산 문제입니다. 그리고 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 
    } 
    } 
} 

인해 정밀도 문제로, 귀하의 예제에서 npfor 루프에서 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"