【问题标题】:How to change the hours in a dataset from 01-24 to 00-23 in R?如何将数据集中的小时数从 R 中的 01-24 更改为 00-23?
【发布时间】:2011-03-30 22:46:15
【问题描述】:

我有一个如下所示的年度每小时数据集。时间是01-24。

 Lines <- "Date,Outdoor,Indoor
 01/01  01:00:00,24.5,21.3
 01/01  02:00:00,24.3,21.1
 01/01  03:00:00,24.1,21.1
 01/01  04:00:00,24.1,20.9
 01/01  05:00:00,25.,21.
 01/01  06:00:00,26.,21.
 01/01  07:00:00,26.6,20.3
 01/01  08:00:00,28.,21.
 01/01  09:00:00,28.9,21.5
 01/01  10:00:00,29.4,22.1
 01/01  11:00:00,30.,22.
 01/01  12:00:00,29.,23.
 01/01  13:00:00,28.4,22.9
 01/01  14:00:00,27.8,22.7
 01/01  15:00:00,27.3,22.3
 01/01  16:00:00,27.,22.
 01/01  17:00:00,26.,21.
 01/01  18:00:00,26.,21.
 01/01  19:00:00,26.3,21.4
 01/01  20:00:00,26.,21.
 01/01  21:00:00,25.9,21.1
 01/01  22:00:00,25.8,21.3
 01/01  23:00:00,25.6,21.4
 01/01  24:00:00,25.5,21.5
 01/02  01:00:00,25.4,21.6
 01/02  02:00:00,25.3,21.8"

如何更改数据,使小时变为 00 到 23,与 R 中的 %H 日期时间格式一致?注意,“01/01 24:00:00”实际上是“01/02 00:00:00”,所以不仅24改成00,而且日期还需要增加一天。

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: datetime r


    【解决方案1】:

    这是一个使用基本 R 的函数。它很快就被破解了,它可以在功能上进行改进,但你会得到漂移。 x 应该是一个字符输入,而 format 给出了日期格式。

    该函数从字符向量中提取日期和时间,找出需要调整的日期,并使用 Date 类是数字的事实。然后gsub 将 24: 转换为 00: 并再次将所有内容粘贴在一起:

    convert.date <- function(x,format="%m/%d"){
      newDate <- Date <- as.Date(x,format=format) 
      times <- gsub(".*?(\\d+:\\d+:*\\d*)","\\1",x) 
    
      id <- grepl("^24:",times) 
      newDate[id] <- Date[id]+1 
      times <- gsub("^24:","00:",times) 
    
      paste(as.character(newDate,format),times)
    }
    

    这给出了:

    > convert.date(Data$Date)
     [1] " 01/01  01:00:00" " 01/01  02:00:00" " 01/01  03:00:00" " 01/01  04:00:00" 
       " 01/01  05:00:00" " 01/01  06:00:00" " 01/01  07:00:00" " 01/01  08:00:00"
     [9] " 01/01  09:00:00" " 01/01  10:00:00" " 01/01  11:00:00" " 01/01  12:00:00" 
       " 01/01  13:00:00" " 01/01  14:00:00" " 01/01  15:00:00" " 01/01  16:00:00"
    [17] " 01/01  17:00:00" " 01/01  18:00:00" " 01/01  19:00:00" " 01/01  20:00:00" 
       " 01/01  21:00:00" " 01/01  22:00:00" " 01/01  23:00:00" " 01/02  00:00:00"
    [25] " 01/02  01:00:00" " 01/02  02:00:00"
    

    从这里开始,您可以继续其余的工作。

    【讨论】:

      【解决方案2】:

      1) 如果01-24映射到00-23的意思是01映射到00,02映射到01等等,那么这里有一个解决方案;否则请参阅下面的 2)。

      gsubfn 包中的gsubfn 函数可以挑选出字符串并将函数应用于它们,将匹配项替换为函数的输出。我们读入行,然后匹配一个空格、两个字符和一个冒号,将这两个字符替换为少一个数字。最后我们重读了一遍:

      library(gsubfn)
      L <- readLines(textConnection(Lines))
      L2 <- gsubfn(" (..):", ~ sprintf(" %02d:", as.numeric(..1)-1), L) 
      DF <- read.csv(textConnection(L2), as.is = TRUE)
      DF$Date <- as.POSIXct(DF$Date, format = "%m/%d  %H:%M:%S")
      

      因此结果的最后一位是:

      > tail(DF)
                     Date Outdoor Indoor
      21  01/01  20:00:00    25.9   21.1
      22  01/01  21:00:00    25.8   21.3
      23  01/01  22:00:00    25.6   21.4
      24  01/01  23:00:00    25.5   21.5
      25  01/02  00:00:00    25.4   21.6
      26  01/02  01:00:00    25.3   21.8
      

      2) 如果将 01-24 映射到 00-23 的意思是 01-23 被映射到主题,24 被映射到第二天的 00,然后计算DF,如上所示,然后执行以下操作:

      DF$Date <- DF$Date + 3600
      

      所以结果的最后一位是:

      > tail(DF)
                        Date Outdoor Indoor
      21 2011-01-01 21:00:00    25.9   21.1
      22 2011-01-01 22:00:00    25.8   21.3
      23 2011-01-01 23:00:00    25.6   21.4
      24 2011-01-02 00:00:00    25.5   21.5
      25 2011-01-02 01:00:00    25.4   21.6
      26 2011-01-02 02:00:00    25.3   21.8
      

      【讨论】:

      • 这不起作用,因为它从 all 次中减去 1。这不是重点,您的输出与原始框架不一致。
      • @J,如果这就是意思,那么我添加了第二个答案,除了最后一行之外,它与第一个答案相同。
      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 2011-04-07
      • 2020-07-17
      • 1970-01-01
      • 2020-07-10
      • 2021-06-11
      • 2017-10-24
      • 1970-01-01
      相关资源
      最近更新 更多