【问题标题】:change date format with Fun in read.zoo在 read.zoo 中使用 Fun 更改日期格式
【发布时间】:2012-10-07 10:47:32
【问题描述】:

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

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

【问题讨论】:

    标签: r csv for-loop zoo


    【解决方案1】:

    我认为您想从 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/" 粘贴到文件xindex.column 列中的数据上。我为此使用paste0(),因为我们想要paste(...., sep = ""),这是一种快速的方法。

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

    示例用法

    这是一个例子:

    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
    

    【讨论】:

    • 我的解决方案有问题:首先我将格式更改为“%Y/%m/%d %H:%M:%S”。仍然存在一个问题并出现警告消息:在 zoo(rval3, ix) 中:如果“order.by”中的索引条目不是唯一的,则“zoo”对象的某些方法不起作用
    • 这意味着时间索引不是唯一的。换句话说,您必须有两行或多行完全相同的时间,到第二行。是这样吗?你有亚秒信息吗?如果是这样,您可能需要一个不同的秒占位符,请参阅?strftime。重新更改格式 - 我可能误解了您的原始数据设置(因此为什么在您的问题中显示/某些 data 很有用)。我从字面上理解你的意思是在小时部分之后有一个实际的H,但我怀疑你的意思是小时是两位数,它被%H覆盖,没有第二个H
    • 上面有file.csv的原始数据。你的想法是正确的,但我不知道我有这个警告。能给我解释一下吗?
    • 使用 %HH 有更多问题: read.zoo(filepath, format = "%Y/%m/%d %HH:%MM:%SS", header = TRUE, :索引在数据行中有 37920 个错误条目:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
    • 你的意思是你想让我为你读?strptime?在您看到 "%m/%d %H:%M:%S" 的位置将其更改为 "%m/%d %H:%M:%OS"。你告诉我日期的问题是秒,不是小数秒。我使用的格式字符串处理秒,而不是小数秒。 %OS 应该可以处理。 zoo 的问题在于,一旦你截断了秒数,你的日期时间就不是唯一的了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2016-04-16
    • 2014-05-07
    • 2018-03-11
    相关资源
    最近更新 更多