【问题标题】:Read xts from CSV file in R从 R 中的 CSV 文件读取 xts
【发布时间】:2011-04-19 08:44:00
【问题描述】:

我正在尝试从 CSV 文件中读取时间序列并将它们保存为 xts 以便能够使用 quantmod 处理它们。问题是数值没有被解析。

CSV 文件:

name;amount;datetime
test1;3;2010-09-23 19:00:00.057
test2;9;2010-09-23 19:00:00.073

R 代码:

library(xts)
ColClasses = c("character", "numeric", "character")
Data <- read.zoo("c:\\dat\\test2.csv", index.column = 3, sep = ";", header = TRUE, FUN = as.POSIXct, colClasses = ColClasses)
as.xts(Data)

结果:

                    name    amount
2010-09-23 19:00:00 "test1" "3"   
2010-09-23 19:00:00 "test2" "9"   

查看金额列包含字符数据,但应为数字。我的代码有什么问题?

【问题讨论】:

    标签: r time-series zoo xts


    【解决方案1】:

    zooxts的内部数据结构都是matrix,所以不能混用数据类型。


    只需用read.table读入数据:

    Data <- read.table("file.csv", sep=";", header=TRUE, colClasses=ColClasses)
    

    我注意到您的数据有亚秒级,因此您可能对xts::align.time 感兴趣。此代码将采用 Data 并创建一个对象,其中每个 "name" 的列以秒为单位。

    NewData <- do.call( merge, lapply( split(Data,Data$name), function(x) {
      align.time( xts(x[,"amount"],as.POSIXct(x[,"datetime"])), n=1 )
    }) )
    

    如果您想在全局环境中创建对象 test1test2,您可以执行以下操作:

    lapply( split(Data,Data$name), function(x) {
      assign(x[,"name"], xts(x[,"amount"],as.POSIXct(x[,"datetime"])),envir=.GlobalEnv)
    })
    

    【讨论】:

    • 我应该使用哪种结构从 CSV 读取数据,然后才能创建仅包含数字数据的动物园?谢谢
    • 你能推荐一些好的R书吗?看来我需要先阅读一些东西。
    • @user194635:请参阅我的编辑以获取第二个问题的答案。关于好的 R 书籍:搜索 ([r] [books]),你会找到很多答案。
    【解决方案2】:

    您不能在 zoo 或 xts 对象中混合数字和字符数据;但是,如果 name 列不是时间序列数据,而是用于区分多个时间序列,一个用于 test1,一个用于 test2,等等,那么您可以使用 split=1 在第 1 列上进行拆分以导致此类拆分如以下代码所示。请务必设置digits.secs,否则您将看不到输出的亚秒数(尽管它们在任何情况下都会出现):

    options(digits.secs = 3)
    z <- read.zoo("myfile.csv", sep = ";", split = 1, index = 3, header = TRUE, tz = "")
    x <- as.xts(z)
    

    【讨论】:

      猜你喜欢
      • 2015-11-26
      • 2012-06-17
      • 2016-06-18
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2021-07-04
      相关资源
      最近更新 更多