R:循环遍历csv文件列表以更改日期格式并创建XTS对象

时间:2016-07-21 08:40:00

标签: r xts

我正在尝试导入csv的文件,并最终将它们转换为R中的XTS对象。

每个csv的格式为:

\ud83d\ude00
��
😀

这里的问题是日期,但是在lubridate中的一个函数很容易转换它。对于个人csv,我的流程如下:

Date       Open    High    Low     Close    Volume
18-Jun-99   2.35    2.35    2.35    2.35    34000
21-Jun-99   2.35    2.35    2.35    2.35    57317
22-Jun-99   2.35    2.35    2.35    2.35    7000

但是我需要为数百个文件执行此操作,因此我希望能够遍历它们。我现在卡在这一点上:

require(xts)
CAR.csv <- read.csv("CAR.csv", header = TRUE)
require(lubridate)
CAR.csv$Date <- dmy(CAR.csv$Date)
CAR.csv <- read.zoo(CAR.csv)
CAR.csv <- as.xts(CAR.csv)

我真的不知道如何将dmy函数仅应用于循环中的日期列,我希望得到任何可以指向正确方向的帮助。

以前版本的csv文件循环具有正确的日期格式:

setwd("C:/Users/Administrator/Desktop/data")
library(xts)
temp = list.files(pattern="*.csv")
for (i in 1:length(temp)) assign(temp[i], read.csv(temp[i], header = TRUE))

就完全可重复的例子而言,如果需要,这里有一个sample folder的csv,但我怀疑这对大多数有能力的R用户来说是直截了当的。

我当然会喜欢一些建议。

非常感谢

3 个答案:

答案 0 :(得分:1)

只需将for循环更改为使用单个文件即可:

for (i in 1:length(temp)){
  assign("new.tmp", read.csv(temp[i], header = TRUE))
  new.tmp$Date <- dmy(new.tmp$Date)
  new.tmp <- read.zoo(new.tmp)
  assign(temp[i],as.xts(new.tmp))
}

这可能花费一点时间,因为您在每次循环迭代中再次复制整个对象,但我认为这是最简单的解决方案。

答案 1 :(得分:1)

setwd("C:/Users/Administrator/Desktop/data")
library(xts)
library(lubridate)

load_file <- function(file_name) {
  csv_file <- read.csv(file_name, header = TRUE)
  csv_file$Date.Time <- dmy(csv_file$Date.Time)
  csv_file <- read.zoo(csv_file)
  csv_file <- as.xts(csv_file)

  csv_file
}

list_of_files = list.files(pattern="*.csv")

data <- lapply(X = list_of_files, FUN = load_file)

代码通过定义一个函数来工作,该函数在给定工作目录中的文件名时,读取它然后执行该文件所需的转换。请注意,在示例数据中,日期列名为Date.Time,因此我更改了代码以反映此情况。

我没有使用循环,而是使用基本的apply(...)函数将函数应用于文件名列表中的每个文件名。此操作的输出是包含您所追求的转换数据的列表。要访问每个数据对象,请使用data[[1]]等。

答案 2 :(得分:0)

通常,我更喜欢在循环之前初始化列表,读取并处理这些文件,然后将它们存储回列表中。

这种方法的主要优点是:

  1. 保持环境清洁
  2. 能够使用lapply对所有已加载的文件执行相同的处理
  3. 只需通过文件名或索引
  4. 对其进行索引即可提取/处理单个文件

    代码示例:

    paths.allFiles = list.files(pattern="*.csv") # Equivalent to "temp"
    processedCSVs = list()
    
    for(path.oneFile in paths.allFiles){ # hint: you can access the file names directly without indexing
      csv =  as.xts(read.zoo(path.oneFile, header = TRUE, sep = ",", FUN = toDate))
      processedCSVs[path.oneFile] = csv
    }
    
    lapply(processedCSVs, nrow) # Returns all the nrows of all files
    nrow(processedCSVs[[1]]) # Returns the nrows of the indexed file only