我有一个年度小时数据集,如下所示。时间是从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,而且日期需要增加一天。
非常感谢任何帮助。感谢。
答案 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