2

我正在从谷歌检索一分钟的报价。处理完数据后,我尝试创建一个间隔为一分钟的 xts 对象,但相同的日期时间重复了几次,但不明白为什么。请注意,如果我使用相同的数据来构建一个称为时间戳的向量,my.dat2它确实有效。

library(xts)
url <- 'https://www.google.com/finance/getprices?q=IBM&i=60&p=15d&f=d,o,h,l,c,v'
x <- read.table(url,stringsAsFactors = F)
mynam <- unlist(strsplit(unlist(strsplit(x[5,], split='=', fixed=TRUE))[2] , split=','))
interv <- as.numeric(unlist(strsplit(x[4,], split='=', fixed=TRUE))[2])

x2 <- do.call(rbind,strsplit(x[-(1:7),1],split=','))
rownames(x2) <- NULL
colnames(x2) <- mynam

ind <- which(nchar(x2[,1])>5)
x2[ind,1] <-  unlist(strsplit(x2[ind,1], split='a', fixed=TRUE))[2]
#To convert from data.frame to numeric
class(x2) <- 'numeric'

my.dat <- rep(0,nrow(x2))
#Convert all to same format
for (i in 1:nrow(x2)) {
  if (nchar(x2[i,1])>5) {
    ini.dat <- x2[i,1]
    my.dat[i] <- ini.dat
  } else {
    my.dat[i] <- ini.dat+interv*x2[i,1]
  }
}

df <- xts(x2[,-1],as.POSIXlt(my.dat, origin = '1970-01-01'))
head(df,20)

my.dat2 <- as.POSIXlt(my.dat, origin = '1970-01-01')
head(my.dat2,20)

我尝试了一个更简单的示例来模拟数据并按分钟创建日期序列来创建 xts 对象,并且它可以正常工作,因此在将日期传递给 xts 函数时一定是我缺少的东西。

4

1 回答 1

1

您的my.dat对象具有重复值,并且 xts 和 zoo 对象必须排序,因此所有重复值都被组合在一起。

问题是这一行,你只取第二个元素,而不是每个非空白元素。

x2[ind,1] <-  unlist(strsplit(x2[ind,1], split='a', fixed=TRUE))[2]
# this should be
x2[ind,1] <- sapply(strsplit(x2[ind,1], split='a', fixed=TRUE), "[[", 2)
于 2013-08-27T18:10:41.760 回答