如何将 "Year"、"Day of the Year" 和 "Hour" 列合并到 R 中的 DateTime?
How to Combine "Year", "Day of the Year", and "Hour" columns to DateTime in R?
我有如下长数据框(注意:DoY:一年中的第几天,小时:一天中的小时(例如,Hour =0.5 表示 12:30 AM):
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, 0, 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)
我有如下长数据框(注意:DoY:一年中的第几天,小时:一天中的小时(例如,Hour =0.5 表示 12:30 AM):
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, 0, 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)