如何解决如何将“年”、“年中的一天”和“小时”列组合到 R 中的日期时间?
我有如下长数据框(注意:DoY:一年中的哪一天,Hour:一天中的小时(例如,Hour =0.5 表示上午 12:30):
Year DoY Hour
2016 126 0.5
2016 126 1
2016 126 1.5
- - -
2016 127 0
2016 127 0.5
- - -
2018 300 23.5
- - -
我正在尝试将这些列合并为单个 DateTime 列(例如 2016-05-05 12:30 AM、2016-05-05 1:00 AM 等)。我尝试了以下代码:
x <- as.numeric(df$Hour)
x.m <- paste(floor(x),round((x-floor(x))*60),sep=":")
df$HourMinute <- x.m
df$DateTime <- strptime(paste0(df$Year,df$DoY,df$HourMinute),format = "%Y%j%H:%M")
上面的代码导致了一些奇怪的输出。一年结束后,它输出 NA 值。如何创建所需的输出列?
解决方法
您可以使用 lubridate
:
library(lubridate)
df$date <- make_datetime(year = df$Year,min = round(df$Hour*60)) + days(df$DoY-1)
df
#> Year DoY Hour date
#> 1 2016 126 0.5 2016-05-05 00:30:00
#> 2 2016 126 1.0 2016-05-05 01:00:00
#> 3 2016 126 1.5 2016-05-05 01:30:00
数据:
df <- structure(list(Year = c(2016L,2016L,2016L),DoY = c(126L,126L,126L),Hour = c(0.5,1,1.5)),class = "data.frame",row.names = c(NA,-3L))
,
这是一个基本的 R 方法。
fun <- function(DF){
d <- with(DF,paste(Year,DoY))
d <- as.Date(d,"%Y %j")
hm <- DF[["Hour"]]*60
d <- paste(d,paste(hm %/% 60,hm %% 60,sep = ":"))
d <- as.POSIXct(d,"%Y-%m-%d %H:%M:%S")
d
}
fun(df)
#[1] "2016-05-05 00:30:00" "2016-05-05 01:00:00"
#[3] "2016-05-05 01:30:00"
这个结果可以用通常的方式分配给一个新列。
df$DateTime <- fun(df)
数据
df <- read.table(text = "
Year DoY Hour
2016 126 0.5
2016 126 1
2016 126 1.5
",header = TRUE)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。