我的数据集将时间列为一天中的 0-23 小时。它们已作为字符类导入到 RStudio 中,读取为 00、01、02、03、04、05 等到 23。我需要这些才能成为时间类并以正确的小时:分钟时间格式(00: 00、01:00、02:00、03:00)。时间类并不特别重要,但它只需要包括小时:分钟。此列称为小时数。
A tibble: 6 × 10
## date station hours AMB_TEMP CO NO NO2 NOx O3 PM10
## <date> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2015-01-01 Cailiao 00 16 0.74 1 15 16 35 171
## 2 2015-01-01 Cailiao 01 16 0.7 0.8 13 14 36 174
## 3 2015-01-01 Cailiao 02 15 0.66 1.1 13 14 35 160
## 4 2015-01-01 Cailiao 03 15 0.61 1.7 12 13 34 142
## 5 2015-01-01 Cailiao 04 15 0.51 2 11 13 34 123
## 6 2015-01-01 Cailiao 05 14 0.51 1.7 13 15 32 110
我尝试将
hours
的类更改为 POSIXct 并指定格式。它没有给我一个错误,但也没有做任何事情。我也尝试使用 subtr 和 strptime 得到相同的结果。
cleantimedata <- timedata %>%
mutate(as.POSIXct(hours, format="%H%M"))
mutate(substr(hours, 0, nchar(hours)-2)) %>%
mutate(paste0(hours, ':', mins))
strftime(strptime(sapply(paste0(hours), function(i) substring(i, nchar(i) - 3, nchar(i))), "%H%M"), format = "%H:%M")
我尝试先更改为数字或解析列中的数字。这会删除第二个数字(00 到 0),但不会更改上述结果。格式肯定太简单了,无法使用 parse_time 但我还是试过了
mutate(hours = parse_number(hours))
mutate(hours = parse_time(hours))
mutate(hours, as.numeric(hours))
更新:我在下面找到了一个(非优雅的)解决方案。我仍然欢迎其他代码更少的解决方案
clean_timedata <- timedata %>%
mutate(hours = stri_pad_right(hours, 4, 0)) %>%
mutate(hours = gsub('(..)(?=.)', '\\1:', hours, perl=TRUE)) %>%
mutate(hours = parse_time(hours)) %>%
mutate(substr(hours, 1, 5)) %>%
select(-hours) %>%
rename("time" = "substr(hours, 1, 5)") %>%
paste() 对你有用吗?
例如:
timedata <- tibble(hours = c("00","01","02","03","04","05","06","07","08","09"))
timedata$hours <- paste(timedata$hours, ":00", sep = "")
timedata$hours