【问题标题】:Reading CSV in R with zoo使用动物园在 R 中读取 CSV
【发布时间】:2016-07-03 16:56:35
【问题描述】:

我有一个格式如下的 CSV:

TICKER,PER,DATE,TIME,CLOSE
SYMBOL,1,20160104,1002,14180.0000000
SYMBOL,1,20160104,1003,14241.0000000

我想把它读成时间序列:

f <- function(a, b) {
    c <- paste(a, b)
    return(strptime(c, format = "%Y%m%d %H%M"))
}
d <- read.zoo("test.csv", FUN = f, index.column = list("DATE", "TIME"))

我得到的是index does not match data。为什么?

【问题讨论】:

标签: r csv xts zoo


【解决方案1】:

字符列和数字列不能同时成为时间序列数据的一部分,因为 zoo 对象的数据部分是矩阵(并且矩阵必须全部为数字、全部为字符或全部为其他类型);但是,可以使用split= 在字符列上拆分为宽格式,而且我们可以通过指定format=tz= 来避免指定函数f。此外,我们必须指定存在标头 (header=) 并且字段用“,”字符分隔 (sep=)。

(下面我们使用text = Lines 来实现可重复性,但实际上将其替换为"test.csv"。)

Lines <- "TICKER,PER,DATE,TIME,CLOSE
SYMBOL,1,20160104,1002,14180.0000000
SYMBOL,1,20160104,1003,14241.0000000"

library(zoo)

read.zoo(text = Lines, header = TRUE, sep = ",", index = c("DATE", "TIME"), 
  split = "TICKER", format = "%Y%m%d %H%M", tz = "")

给予:

                    PER CLOSE
2016-01-04 10:02:00   1 14180
2016-01-04 10:03:00   1 14241

注意:如果你确实想使用你的函数f,那么省略formattz并使用:

read.zoo(text = Lines, header = TRUE, sep = ",", index = c("DATE", "TIME"), 
  split = "TICKER", FUN = f)

这也可以,即将它读入数据框,然后将数据框读入动物园对象:

DF <- read.csv(text = Lines) # read.csv defaults to header=TRUE, sep=","
read.zoo(DF, index = c("DATE", "TIME"), split = "TICKER", FUN = f)

【讨论】:

    【解决方案2】:

    您需要指定header = TRUEsep = ",",因为它们不是read.zoo 的默认值,就像read.csv 一样。

    d <- read.zoo(text="TICKER,PER,DATE,TIME,CLOSE
    SYMBOL,1,20160104,1002,14180.0000000
    SYMBOL,1,20160104,1003,14241.0000000",
      FUN = f, index.column = list("DATE", "TIME"),
      header=TRUE, sep=",")
    d
    #                     TICKER PER CLOSE
    # 2016-01-04 10:02:00 SYMBOL 1   14180
    # 2016-01-04 10:03:00 SYMBOL 1   14241
    

    【讨论】:

    • 请注意,这里的数据部分是一个字符矩阵,这不太可能是您想要的。
    猜你喜欢
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多