如何在R中将数据集中的小时数从01-24更改为00-23?

时间:2011-03-30 22:46:16

标签: datetime r

我有一个年度小时数据集,如下所示。时间是从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,而且日期需要增加一天。

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

2 个答案:

答案 0 :(得分:1)

这是一个使用基本R的功能。这很快就被黑客攻击,它可以在功能上得到改进,但你得到了漂移。 x应该是字符输入,格式给出日期格式。

该函数从字符向量中提取日期和时间,找出需要调整的日期,并使用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"

从这里开始,你可以继续休息。

答案 1 :(得分:1)

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