R xts:索引为 0.001 毫秒 [英] R xts: .001 millisecond in index
问题描述
看起来 POSIXlt 允许毫秒精度规范,但是在 xts 对象中设置 .001 毫秒索引值时遇到问题:
It looks like POSIXlt allows millisecond precision specification, but I have a problem when setting a .001 millisecond index value in an xts object:
> 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 毫秒设置失败?
Why the 001 millisecond setting fails?
推荐答案
我怀疑这是一个舍入/浮点问题:
I suspect this is a rounding/floating point issue:
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()
实现的
That was achieved by debugging xts()
on a the call
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
不能精确地以 .001
毫秒创建或存储您的小数秒数.而截断为 3 dp 将保留 .002
因为它存储为:
Indicating your fractional number of seconds can't be created nor stored at exactly .001
milliseconds. Whereas truncation as 3 dp will keep .002
as it is stored as:
> print(as.numeric(as.POSIXlt("2012-03-20 09:02:50.002")), digits = 20)
[1] 1332234170.0020000935
将其截断或四舍五入到 3 dp 将保留 .002
部分.您在使用计算机时必须处理的问题之一.
Truncating or rounding that to 3 dp will preserve the .002
part. One of the issues you have to deal with in working with computers.
请注意,这似乎只是索引日期打印表示中的一个问题:
Do note that this appears to just be an issue in the printed representation of the index dates:
> print(as.numeric(index(foo)[1]), digits = 20)
[1] 1332234170.0009999275
精度(有浮点问题)保留在存储索引时间的实际对象中 - 在将时间打印到控制台时您看不到这一点.
The precision (with floating point issues) is preserved in the actual object storing the index times - you just can't see that when printing the times to the console.
这篇关于R xts:索引为 0.001 毫秒的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!