2012-03-20 17 views
2

它看起來像POSIXlt允許毫秒精度規格,但是我有在XTS對象設定一個0.001毫秒索引值時的問題:ř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)'這樣你就不會看到你的決議指定顯示。從更廣泛的意義上說,對於最小的「epsilon」變化,你的問題是一個不適當的測試,但你可以在下面看到我的答案。 – 2012-03-20 17:07:06

回答

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 

,這是通過在呼叫

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

調試xts()但你可以通過

通過清楚地看到問題實現
> 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 DP將保持.002,因爲它被存儲爲:

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

截斷或舍入到3 DP將保留.002部分。與計算機一起處理的問題之一。

注意,這似乎只是在索引日期的印刷代表性的問題:

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

精度(浮點問題)是保存在實際的對象存儲指數倍 - 在打印時間到控制檯時你看不到。

+0

這與四捨五入有關,以及POSIXct是如何實現的。 – 2012-03-20 14:21:02

4

POSIXct表示法是由Ripley教授非常聰明地'破解'的,他將標準的雙字節單詞分解爲'通常'曆元以來的天數'仍然足夠',再加上'適當的精度對於亞秒數據「。它的工作原理了周圍一微秒:

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>