由于某种原因,当我将时间序列数据从数据帧转换为xts对象时,时区包含在索引中。当我试图在对象上运行时间序列建模时,我怀疑这就是问题所在,因为我一直会出错。当我去检查xts对象的结构时,xts对象内部的数据会以某种方式转换为chr。它们应该是num,这是它们在转换之前的原始值。以下是一些数据:
full_timestamp PRICE
2015-01-02 10:02:27.389055 85.4
2015-01-02 10:03:30.926059 85.3
2015-01-02 10:04:52.231750 85.4
2015-01-02 10:05:37.139763 85.5
2015-01-02 10:06:54.926069 85.5
2015-01-02 10:07:57.253187 85.3
以下是数据帧的结构:
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 89026 obs. of 2 variables:
$ full_timestamp: POSIXct, format: "2015-01-02 10:02:27.389055" "2015-01-02 10:03:30.926059" "2015-01-02 10:04:52.231750" ...
$ PRICE : num 85.4 85.3 85.4 85.5 85.5 ...
我用来将时间戳从字符向量转换为POSIXct时间戳的代码:
testing_eq_4xts$full_timestamp <- as.POSIXct(strptime(testing_eq_4xts$full_timestamp,
format = "%Y-%m-%d:%H:%M:%OS",
tz = ""))
我试着包括tz = ""
,根本不包括tz
部分,甚至包括Sys.unsetenv("TZ")
,以停止占用时区的转换。我还应该强调,我需要时间戳中的粒度来进行建模。这是我用来转换为xts:的代码
testing_eq_xts <- as.xts(testing_eq_4xts[, names(testing_eq_4xts) != "full_timestamp"],
order.by = testing_eq_4xts$full_timestamp, unique = F)
这就是结构的样子:
An ‘xts’ object on 2015-01-02 10:02:27.389055/2015-12-31 14:37:07.969814 containing:
Data: num [1:89026, 1] 85.4 85.3 85.4 85.5 85.5 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr "PRICE"
Indexed by objects of class: [POSIXct,POSIXt] TZ:
xts Attributes:
NULL
还有xts的索引:
[1] "2015-01-02 10:02:27.389055 AEDT" "2015-01-02 10:03:30.926059 AEDT"
[3] "2015-01-02 10:04:52.231750 AEDT" "2015-01-02 10:05:37.139763 AEDT"
将时间戳保留为字符向量,并在转换为xts时尝试将其转换为POSIXct也不起作用,使用:
testing_eq_xts2 = xts(testing_eq_4xts[, 2], as.POSIXct(testing_eq_4xts[, 1]))
给出以下错误:
Error in as.POSIXct.default(testing_eq_4xts[, 1]) :
do not know how to convert 'testing_eq_4xts[, 1]' to class “POSIXct”
我是否正确理解了为什么在xts对象中将PRICE
转换为chr
,如果是,我该如何修复它?如果我的假设不正确,那么我需要做什么来解决这个问题?谢谢
您已经发现"tz"值有时是",但如果查看?strptime
,您会发现使用tz=""
实际上是在使用您的当前时区,该时区将从您的系统设置中提取。您应该使用tz="GMT"
(假设UTC/UCT是您所说的"无时区"的意思。(实际上没有"无时区的",因为时间总是在某个时区或另一个时区测量的。
而且。。。在xts(或zoo(对象中不能有POSIXct列(可能也不是字符值,因为您通常希望xts对象包含数值(。这是因为xts
和zoo
对象实际上是R矩阵,它们不能包含具有属性的列。由于POSIXct对象实际上是类属性为"POSIXct"的双对象(自原点算起的秒数(,因此它们不能是xts或zoo矩阵中的元素。(它们可以是xts-index,因为结构的这一部分有不同的规则。(
myxts <- as.xts(read.csv.zoo(text="full_timestamp, PRICE
2015-01-02 10:02:27.389055, 85.4
2015-01-02 10:03:30.926059, 85.3
2015-01-02 10:04:52.231750, 85.4
2015-01-02 10:05:37.139763, 85.5
2015-01-02 10:06:54.926069, 85.5
2015-01-02 10:07:57.253187, 85.3", sep=",", index=1, tz="GMT"))
myxts
#-----------------
[,1]
2015-01-02 10:02:27 85.4
2015-01-02 10:03:30 85.3
2015-01-02 10:04:52 85.4
2015-01-02 10:05:37 85.5
2015-01-02 10:06:54 85.5
2015-01-02 10:07:57 85.3
Warning message:
timezone of object (GMT) is different than current timezone ().
dput(myxts)
#-------------
structure(c(85.4, 85.3, 85.4, 85.5, 85.5, 85.3), .Dim = c(6L,
1L), index = structure(c(1420192947.38906, 1420193010.92606,
1420193092.23175, 1420193137.13976, 1420193214.92607, 1420193277.25319
), tzone = "GMT", tclass = c("POSIXct", "POSIXt")), class = c("xts",
"zoo"))
index(myxts)
#--------------
[1] "2015-01-02 10:02:27 GMT" "2015-01-02 10:03:30 GMT" "2015-01-02 10:04:52 GMT"
[4] "2015-01-02 10:05:37 GMT" "2015-01-02 10:06:54 GMT" "2015-01-02 10:07:57 GMT"