3

我尝试使用此代码通过 read.zoo 读取多个 CSV 文件,但我遇到了问题。方向不同,所以我用file.path(). 问题是:原始文件中的 Date.Time 有 Date format= "%m/%d %HH:%MM:%SS",我需要在函数"%Y/"之前或内部添加read.zoo()。我怎么能这样做?我尝试使用子函数,但我需要一个参数。哪一个?是否有可能绕过这个问题?

library(zoo)
for(i in Dir1){
   filepath <- file.path(paste(i,".csv",sep=""))
   #f<-function(x) sub("([[:print:]]{15})$", "2005/\\1",x)
   dat<-read.zoo(filepath,header=TRUE,sep=",",
                 FUN = function(x) sub("([[:print:]]{15})$", "2005/\\1"))
   filenames <- substr(filepath,122,155)
   names <-substr(filenames,1,21)
   assign(names, dat)
}

   Some of my data:
   Date.time,Outdoor Dry Bulb [C],Outdoor Relative Humidity [%],Air Temperature [C],Surface Temperature [C]
   01/01  00:03:00,0.0,50.,23.,16.3588068633603
   01/01  00:06:00,0.0,50.,23.,16.1696661072302
   01/01  00:09:00,0.0,50.,23.,13.8864861630478 
   01/01  00:12:00,0.0,50.,23.,13.006618496734
   01/01  00:15:00,0.0,50.,23.,12.5542552024807 
   01/01  00:18:00,0.0,50.,23.,11.6201669301972
4

1 回答 1

3

我认为您想从 R 的角度考虑这一点,并将paste()字符串放在一起,而不是使用正则表达式,这在这里有点矫枉过正。例如::

f <- function(x, format) {
    as.POSIXct(paste0("2005/", as.character(x)), format = format)
}

然后调用为:

read.zoo(filepath, format = "%Y/%m/%d %H:%M:%S", header=TRUE,
         sep=",", FUN = f)

的解释f()

为了解释f(),请注意read.zoo()将从读入的文件中传递FUNindex.column。这将是一个字符向量或一个包含文件数据的因子(取决于使用的设置)。as.character(x)所以我们可以通过(x是我们用来引用 ) 中的数据来强制转换字符index.column。接下来,我们将字符串粘贴到文件列中的"2005/"数据上。我根据需要使用它,这是一种快速的方法。index.columnxpaste0()paste(...., sep = "")

最后阶段是将生成的字符向量转换为适合 R 的 DateTime 类。我as.POSIXct()用于此目的。read.zoo()确保将format参数传递给,FUN以便我们可以使用我们的f(),并将其传递给函数的format参数,as.POSIXct()以便它了解我们传递给它的日期时间信息的结构。

示例用法

这是一个例子:

set.seed(1)
dat <- data.frame(Index = seq(Sys.time(), by = "2 hours", length = 50),
                  Data  = rnorm(50))
dat <- transform(dat, Index = strftime(Index, format = "%m/%d %H:%M:%S"))
head(dat)

> head(dat)
           Index       Data
1 10/17 12:53:35 -0.6264538
2 10/17 14:53:35  0.1836433
3 10/17 16:53:35 -0.8356286
4 10/17 18:53:35  1.5952808
5 10/17 20:53:35  0.3295078
6 10/17 22:53:35 -0.8204684

## write to file
write.csv(dat, file = "mydata.csv", row.names = FALSE)

好的,现在假设这mydata.csv是您的数据文件,使用read.zoo()上面的函数和用户函数读取它f

myzoo <- read.zoo("mydata.csv", format = "%Y/%m/%d %H:%M:%S",
                  header = TRUE, sep = ",", FUN = f)
head(myzoo)

这使:

> head(myzoo)
2005-10-17 12:53:35 2005-10-17 14:53:35 2005-10-17 16:53:35 2005-10-17 18:53:35 
         -0.6264538           0.1836433          -0.8356286           1.5952808 
2005-10-17 20:53:35 2005-10-17 22:53:35 
          0.3295078          -0.8204684
于 2012-10-17T12:08:01.293 回答