【问题标题】:How to Combine "Year", "Day of the Year", and "Hour" columns to DateTime in R?如何在 R 中将“年”、“年”和“小时”列与 DateTime 结合起来?
【发布时间】:2021-03-04 22:20:53
【问题描述】:

我有如下长数据框(注意:DoY:一年中的哪一天,小时:一天中的小时(例如,小时 = 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 值。如何创建所需的输出列?

【问题讨论】:

  • 你能解释一下“一年结束后”是什么意思吗?
  • 我所说的“一年结束后”的意思是我上面写的代码可以正常工作一年(例如,2016 年),但它在明​​年年初(即 2017 年)创造了 NA 值和 2018 年)。

标签: r datetime dplyr lubridate


【解决方案1】:

你可以使用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))

【讨论】:

  • 很高兴它有帮助!注意我的小编辑:我从days(df$DoY-1)中删除了 1 天
  • 为什么要删除 1 天?当我使用以下公式 df$date
  • 感谢您的反馈:我认为这取决于如何定义 DoY。 make_datetime(year) 从一年的第一天开始,我们将 DoY 添加到其中。如果DoY 为 1,则结果为 1+1 = 2nd day。你那边DoY的定义是什么?
  • 我的错!实际上,我在计算中忽略了闰年,导致计算不正确。你的公式是正确的。我们应该删除 1 天,这在所有情况下都可以正常工作。谢谢!
【解决方案2】:

这是一个基本的 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)

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2017-10-24
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2019-08-18
    相关资源
    最近更新 更多