在read.zoo中使用Fun更改日期格式

时间:2012-10-17 08:12:59

标签: r csv for-loop zoo

我尝试使用此代码使用read.zoo读取多个CSV文件,但我遇到了问题。方向不同所以我使用了file.path()。问题是:Date.Time到原始文件的日期为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

1 个答案:

答案 0 :(得分: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()将从读入的文件中传递FUN index.column列。这将是一个字符向量或一个因子(取决于包含您文件中数据的设置。因此,我们可以通过as.character(x)强制转换为字符(x是我们用来引用index.column中的数据的内容。接下来,我们将字符串"2005/"粘贴到文件index.column的{​​{1}}列中的数据上。我使用x作为我们想要的paste0(),这是一种快速的方法。

最后一步是将结果字符向量转换为R的适当DateTime类。我使用paste(...., sep = "")as.POSIXct()确保将read.zoo()参数传递给format,以便我们可以使用FUN,并将其传递给f()的{​​{1}}参数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)