首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:循环遍历csv文件列表以更改日期格式并创建XTS对象

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

Stack Overflow用户
提问于 2016-07-21 08:40:00
回答 3查看 401关注 0票数 2

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

每一个csv的格式如下:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)

但是,我需要对数百个文件执行此操作,因此我希望能够遍历所有这些文件。我现在被困在这一点上:

代码语言:javascript
复制
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))

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

具有正确日期格式的csv文件的前一个循环版本如下:

代码语言:javascript
复制
setwd("C:/Users/Administrator/Desktop/data")
library(xts)
temp = list.files(pattern="*.csv")
toDate <- function(x) as.Date(x, origin = "2005-01-01")
for (i in 1:length(temp)) assign(temp[i], as.xts(read.zoo((temp[i]), header = TRUE, sep = ",", FUN = toDate)))

在一个完全可复制的例子,这里是一个样本文件夹的csv's,如果需要,但我怀疑这是直接对大多数称职的R用户。

我当然想听听一些建议。

非常感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-21 09:26:20

代码语言:javascript
复制
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列称为Date.Time,因此我更改了代码以反映这一点。

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

票数 2
EN

Stack Overflow用户

发布于 2016-07-21 09:26:14

只需将for-循环更改为要处理单个文件:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-07-21 09:33:58

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

这种办法的主要优点是:

  1. 保持环境清洁
  2. 能够使用lapply对加载的所有文件执行相同的处理
  3. 通过简单地通过文件名或索引索引来提取/处理单个文件的能力

代码示例:

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38499196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档