R:遍历 csv 文件列表以更改日期格式并创建 XTS 对象
R: Loop through a list of csv files to alter date format and create XTS objects
我正在尝试导入一个 csv 文件并最终将它们转换为 R 中的 XTS 对象。
每个单独的 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
这里的问题是日期,但是 lubridate 中的函数可以轻松转换它。对于个人 csv,我的过程如下:
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)
但是我需要对数百个文件执行此操作,因此我希望能够遍历所有文件。我现在被困在这一点上:
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 函数仅应用于循环中的日期列,我希望得到任何可以为我指明正确方向的帮助。
我的具有正确日期格式的 csv 文件循环的先前版本是这样的:
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)))
就完全可重现的示例而言,如果需要,这里有一个 sample folder 的 csv,但我怀疑这对于大多数有能力的 R 用户来说是直截了当的。
我当然希望得到一些建议。
非常感谢
只需将您的 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))
}
这可能会花费一点时间,因为您在每次循环迭代中都会多次复制整个对象,但我认为这是最简单的解决方案。
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]]
等
一般来说,我更喜欢在循环之前初始化一个列表,读取并处理该文件,然后将它们存储回列表中。
这种方法的主要优点是:
- 保持环境清洁
- 能够使用
lapply
对所有加载的文件进行相同的处理
- 能够 extract/process 通过简单地按文件名或索引索引单个文件
代码示例:
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
我正在尝试导入一个 csv 文件并最终将它们转换为 R 中的 XTS 对象。
每个单独的 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
这里的问题是日期,但是 lubridate 中的函数可以轻松转换它。对于个人 csv,我的过程如下:
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)
但是我需要对数百个文件执行此操作,因此我希望能够遍历所有文件。我现在被困在这一点上:
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 函数仅应用于循环中的日期列,我希望得到任何可以为我指明正确方向的帮助。
我的具有正确日期格式的 csv 文件循环的先前版本是这样的:
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)))
就完全可重现的示例而言,如果需要,这里有一个 sample folder 的 csv,但我怀疑这对于大多数有能力的 R 用户来说是直截了当的。
我当然希望得到一些建议。
非常感谢
只需将您的 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))
}
这可能会花费一点时间,因为您在每次循环迭代中都会多次复制整个对象,但我认为这是最简单的解决方案。
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]]
等
一般来说,我更喜欢在循环之前初始化一个列表,读取并处理该文件,然后将它们存储回列表中。
这种方法的主要优点是:
- 保持环境清洁
- 能够使用
lapply
对所有加载的文件进行相同的处理 - 能够 extract/process 通过简单地按文件名或索引索引单个文件
代码示例:
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