【发布时间】:2011-11-12 14:24:39
【问题描述】:
假设我有:
R> str(data)
'data.frame': 4 obs. of 2 variables:
$ datetime: Factor w/ 4 levels "2011-01-05 09:30:00.001",..: 1 2 3 4
$ price : num 18.3 18.3 18.3 18.3
R> data
datetime price
1 2011-01-05 09:30:00.001 18.31
2 2011-01-05 09:30:00.321 18.33
3 2011-01-05 09:30:01.511 18.33
4 2011-01-05 09:30:02.192 18.34
当我尝试将其加载到 xts 对象中时,时间戳会被巧妙地改变:
R> x <- xts(data[-1], as.POSIXct(strptime(data$datetime, '%Y-%m-%d %H:%M:%OS')))
R> str(x)
An ‘xts’ object from 2011-01-05 09:30:00.000 to 2011-01-05 09:30:02.191 containing:
Data: num [1:4, 1] 18.3 18.3 18.3 18.3
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr "price"
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
NULL
R> x
price
2011-01-05 09:30:00.000 18.31
2011-01-05 09:30:00.321 18.33
2011-01-05 09:30:01.510 18.33
2011-01-05 09:30:02.191 18.34
您会注意到时间戳已更改。第一个条目现在出现在09:30:00.000,而不是原始数据所说的09:30:00.001。第三行和第四行也不对。
这是什么原因造成的?我在做一些根本错误的事情吗?我尝试了各种咒语将数据放入xts 对象中,它们似乎都表现出这种行为。
编辑:添加sessionInfo()
R> sessionInfo()
R version 2.13.1 (2011-07-08)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8
[4] LC_COLLATE=C LC_MONETARY=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] xts_0.8-2 zoo_1.7-4
loaded via a namespace (and not attached):
[1] grid_2.13.1 lattice_0.19-30 tools_2.13.1
编辑 2:如果我将源数据修改为微秒精度,如下所示:
datetime,price
2011-01-05 09:30:00.001000,18.31
2011-01-05 09:30:00.321000,18.33
2011-01-05 09:30:01.511000,18.33
2011-01-05 09:30:02.192000,18.34
然后加载它,这样我就有了:
R> test
datetime price
1 2011-01-05 09:30:00.001000 18.31
2 2011-01-05 09:30:00.321000 18.33
3 2011-01-05 09:30:01.511000 18.33
4 2011-01-05 09:30:02.192000 18.34
然后,最后,将其转换为xts 对象并设置索引格式:
R> x <- xts(test[,-1], as.POSIXct(strptime(test$datetime, '%Y-%m-%d %H:%M:%OS')))
R> indexFormat(x) <- '%Y-%m-%d %H:%M:%OS6'
R> x
[,1]
2011-01-05 09:30:00.000999 18.31
2011-01-05 09:30:00.321000 18.33
2011-01-05 09:30:01.510999 18.33
2011-01-05 09:30:02.191999 18.34
您也可以看到效果。我希望增加额外的精度会有所帮助,但不幸的是它没有。
编辑 3:请参阅 @DWin's answer 了解重现此行为的端到端测试用例。
编辑 4: 行为似乎不是面向毫秒的。下面显示了微秒分辨率时间戳的相同更改结果。如果我将输入数据更改为:
R> data
datetime price
1 2011-01-05 09:30:00.001001 18.31
2 2011-01-05 09:30:00.321001 18.33
3 2011-01-05 09:30:01.511001 18.33
4 2011-01-05 09:30:02.192005 18.34
然后创建一个xts对象:
R> x <- xts(data[-1],
as.POSIXct(strptime(as.character(data$datetime), '%Y-%m-%d %H:%M:%OS')))
R> indexFormat(x) <- '%Y-%m-%d %H:%M:%OS6'
R> x
price
2011-01-05 09:30:00.001000 18.31
2011-01-05 09:30:00.321001 18.33
2011-01-05 09:30:01.511001 18.33
2011-01-05 09:30:02.192004 18.34
编辑 5: 这似乎是一个浮点精度问题。观察:
R> t <- as.POSIXct("2011-01-05 09:30:00.001001")
R> t
[1] "2011-01-05 09:30:00.001 CST"
R> as.numeric(t)
[1] 1294241400.0010008812
这显示了错误行为,并且与 EDIT 4 中的示例一致。但是,使用未显示错误的示例:
R> t <- as.POSIXct("2011-01-05 09:30:01.511001")
R> t
[1] "2011-01-05 09:30:01.511001 CST"
R> as.numeric(t)
[1] 1294241401.5110011101
似乎xts 或某些基础组件正在向下舍入而不是最接近的?
【问题讨论】:
-
我无法复制这个...你的
sessionInfo()是什么? -
添加
sessionInfo()输出作为编辑 -
我有一段记忆,动物园对象与 xts 相关,它们的索引值在系列的开头和结尾略微扩展。还是仅使用 seq.zoo?这实际上并不能解释你所看到的一切,因为高端它也被“推回”。这可能是闰秒问题吗?
-
没有
seq.zoo这样的方法。目前尚不清楚“略微扩展”是指什么,但暗示动物园在不询问的情况下对索引值进行某种不良的捣乱是不太可能的。 -
对不起。我可能将其他一些函数的行为混为一谈,
hist或cut也许有一种方法可以扩展日期时间范围以避免在极端情况下丢弃事件。
标签: r time-series xts