“如何结合”;年份&引用;“一年中的某一天”;,及;小时“;列到R中的DateTime?

“如何结合”;年份&引用;“一年中的某一天”;,及;小时“;列到R中的DateTime?,r,datetime,dplyr,lubridate,R,Datetime,Dplyr,Lubridate,我有如下长数据帧(注:DoY:一年中的一天,小时:一天中的一小时(例如,小时=0.5表示上午12:30): 我正在尝试将这些列合并为单个日期时间列(例如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 d

我有如下长数据帧(注:DoY:一年中的一天,小时:一天中的一小时(例如,小时=0.5表示上午12:30):

我正在尝试将这些列合并为单个日期时间列(例如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")

x您可以使用
lubridate

库(lubridate)
df$日期年份DoY小时日期
#> 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))

df这里是一个基本的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"

fun你能解释一下“年终后”是什么意思吗?我所说的“年终后”是指我上面写的代码在一年内(如2016年)运行良好,但它在明年初(即2017年和2018年)创造了NA值。很高兴它有所帮助!注意我的小编辑:我从
天中删除了1天(df$DoY-1)
为什么删除1天?当我使用以下公式df$date时,我的DateTime输出是正确的。感谢您的反馈:我认为这取决于DoY的定义。
make_DateTime(year)
从一年的第一天开始,我们将
DoY
添加到它。如果
DoY
为1,它将导致1+1=第二天。你方
DoY
的定义是什么?我的错误!实际上,我在计算中忽略了闰年日,这导致了错误的计算。你的公式是正确的。我们应该删除1天wh我在任何情况下都能正常工作。谢谢!
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)