在R中创建具有分钟间隔的xts对象时的意外日期格式

时间:2013-08-27 17:19:45

标签: r xts

我正在从谷歌检索一分钟的报价。在处理完数据之后,我尝试以一分钟的间隔创建一个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函数时所缺少的东西。

1 个答案:

答案 0 :(得分: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)