【问题标题】:How to create intervals of 1 hour如何创建 1 小时的间隔
【发布时间】:2021-12-21 06:31:29
【问题描述】:

如何为每个日期创建每小时时间戳?

例如从 00:00 到 23:59。该函数的结果可能是 10:00。我在互联网上读到循环可以工作,但我们无法使其适合。

数据样本:

df = data.frame( id = c(1, 2, 3, 4), Date = c(2021-04-18, 2021-04-19, 2021-04-21
07:07:08.000, 2021-04-22))

【问题讨论】:

  • 使用 dput 将数据正确转换为 R 代码。
  • 你可以通过seq(as.POSIXct("2021-04-18"), as.POSIXct("2021-04-23"), by = "hour")获得每小时时间戳
  • 做什么例如从 00:00 到 23:59。该函数的结果可能是 10:00。 是什么意思? 10:00 不是每小时的序列,这与显示的 df 有什么关系?

标签: r loops date


【解决方案1】:

几点:

  • 问题中显示的输入不是有效的 R 语法,因此我们假设我们拥有的是在最后的注释中可重现地显示的数据框。

  • 问题没有描述所需的具体输出,因此我们假设需要的是每小时值的 POSIXct 向量,在下面的 (1) 中,我们假设是从最小日期的第一个小时到最后一个小时当前时区或下面 (2) 中的最大日期,我们假设我们只希望 df 中日期的小时序列也在当前时区中。

  • 我们假设输入中的任何时间都应该被删除。

  • 我们假设输入的 id 列应该被忽略。

没有使用任何包。

1) 这会计算第一个日期的 0 小时和最后一个日期之后的第二天的 0 小时,给出 rng。 as.Date 采用 Date 部分,范围将最小和最大日期提取到两个分量的向量中,添加 0:1 将第一个日期添加 0 使其保持原样,将其转换为第二个日期的 1 将其转换为之后的日期最后日期。该格式确保日期在当前时区而不是 UTC 中转换为 POSIXct。然后它从这些数据中创建一个每小时的序列,并使用 head 删除最后一个值,因为它将是输入最后一个日期的后一天。

rng <- as.POSIXct(format(range(as.Date(df$Date)) + 0:1))
head(seq(rng[1], rng[2], "hour"), -1)

2) 另一种可能性是将每个日期与每个小时从 0 到 23 粘贴在一起,然后将其转换为 POSIXct。如果输入日期是连续的,这将给出相同的结果;否则,它将仅给出所提供日期的小时数。

with(expand.grid(Date = as.Date(df$Date), hour = paste0(0:23, ":00:00")), 
  sort(as.POSIXct(paste(Date, hour))))

注意

df <- data.frame( id = c(1, 2, 3, 4), 
  Date = c("2021-04-18", "2021-04-19", "2021-04-21 07:07:08.000", "2021-04-22"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-06
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多