2012-03-20 1 views
2

Похоже POSIXlt позволяет миллисекунду точности спецификации, но у меня есть проблема, когда параметр значения индекса на 0,001 миллисекунд в объекте XTS:R XTS: +0,001 миллисекунды в индексе

> options(digits.secs = 3) 
> data(sample_matrix) 
> sample.xts = xts(sample_matrix, rep(as.POSIXlt("2012-03-20 09:02:50.001"), 180)) 
> head(sample.xts, 10) 
          Open  High  Low Close 
2012-03-20 09:02:50.000 50.03978 50.11778 49.95041 50.11778 
2012-03-20 09:02:50.000 50.23050 50.42188 50.23050 50.39767 
2012-03-20 09:02:50.000 50.42096 50.42096 50.26414 50.33236 
2012-03-20 09:02:50.000 50.37347 50.37347 50.22103 50.33459 
2012-03-20 09:02:50.000 50.24433 50.24433 50.11121 50.18112 
2012-03-20 09:02:50.000 50.13211 50.21561 49.99185 49.99185 
2012-03-20 09:02:50.000 50.03555 50.10363 49.96971 49.98806 
2012-03-20 09:02:50.000 49.99489 49.99489 49.80454 49.91333 
2012-03-20 09:02:50.000 49.91228 50.13053 49.91228 49.97246 
2012-03-20 09:02:50.000 49.88529 50.23910 49.88529 50.23910 
> sample.xts = xts(sample_matrix, rep(as.POSIXlt("2012-03-20 09:02:50.002"), 180)) 
> head(sample.xts, 10) 
          Open  High  Low Close 
2012-03-20 09:02:50.002 50.03978 50.11778 49.95041 50.11778 
2012-03-20 09:02:50.002 50.23050 50.42188 50.23050 50.39767 
2012-03-20 09:02:50.002 50.42096 50.42096 50.26414 50.33236 
2012-03-20 09:02:50.002 50.37347 50.37347 50.22103 50.33459 
2012-03-20 09:02:50.002 50.24433 50.24433 50.11121 50.18112 
2012-03-20 09:02:50.002 50.13211 50.21561 49.99185 49.99185 
2012-03-20 09:02:50.002 50.03555 50.10363 49.96971 49.98806 
2012-03-20 09:02:50.002 49.99489 49.99489 49.80454 49.91333 
2012-03-20 09:02:50.002 49.91228 50.13053 49.91228 49.97246 
2012-03-20 09:02:50.002 49.88529 50.23910 49.88529 50.23910 

Почему настройки 001 миллисекунды потерпит неудачу?

+0

Ваша «проблема» в узком смысле является то, что вы сделали ** ** не делать 'опции (digits.secs = 6)', так что вы не видите разрешение, указанный отображается. В более широком смысле ваша проблема является неуместным тестом для наименьшего заметного изменения «эпсилон», но вы можете увидеть мой ответ ниже для этого. –

ответ

2

Я подозреваю, что это округление/точка проблема с плавающей:

Browse[2]> print(head(as.numeric(order.by)), digits = 20) 
[1] 1332234170.0009999275 1332234170.0009999275 1332234170.0009999275 
[4] 1332234170.0009999275 1332234170.0009999275 1332234170.0009999275 

Это было достигнуто за счет отладки xts() на вызове

foo <- xts(1:180, rep(as.POSIXlt("2012-03-20 09:02:50.001"), 180), 
      unqiue = FALSE) 

но вы можете увидеть проблему с помощью ясно через

> print(as.numeric(as.POSIXlt("2012-03-20 09:02:50.001"))) 
[1] 1332234170 
> print(as.numeric(as.POSIXlt("2012-03-20 09:02:50.001")), digits = 20) 
[1] 1332234170.0009999275 

Указывать, что ваше дробное число секунд не может быть создано или сохранено t точно .001 миллисекунд. В то время как усечение 3 дп будет держать .002, поскольку он хранится как:

> print(as.numeric(as.POSIXlt("2012-03-20 09:02:50.002")), digits = 20) 
[1] 1332234170.0020000935 

Усечение или округление, что 3 дп сохранит .002 часть. Одна из проблем, с которой вам приходится иметь дело при работе с компьютерами.

Обратите внимание, что это, кажется, просто проблема в печатной представления даты индекса:

> print(as.numeric(index(foo)[1]), digits = 20) 
[1] 1332234170.0009999275 

Точность (с плавающей проблемы точкой) сохраняется в действительном объекте хранения времени индекс - вы просто не видите, что при печати времени на консоль.

+0

Это связано с округлением и использованием POSIXct. –

4

Представление POSIXct - очень умный «взлом» профессора Рипли, который разбивает стандартное двухбайтовое слово на «все еще достаточно» для обычного «количества дней с эпохи», плюс «подходящее количество точности для субсекундных данных ". Он работает около микросекунды:

R> now <- Sys.time() 
R> for (x in seq(1,10)) print(difftime(now, now + 10^-x)) 
Time difference of -0.0999999 secs 
Time difference of -0.00999999 secs 
Time difference of -0.000999928 secs 
Time difference of -9.98974e-05 secs 
Time difference of -1.00136e-05 secs 
Time difference of -9.53674e-07 secs 
Time difference of 0 secs 
Time difference of 0 secs 
Time difference of 0 secs 
Time difference of 0 secs 
R>