【问题标题】:fill sequence of datetimes填充日期时间序列
【发布时间】:2018-09-06 14:19:00
【问题描述】:

我有一个由 ID、DateTimes 和 Values 组成的 data.frame。对于每个 ID,我想扩展 DateTimes,以便在最小值和最大值之间每小时有一个。 ID 和 Value 列应填写各自的值(即不是 NA)。永远不会有每个 ID 有多个唯一值的情况。例如,新的 data.frame 应该有 4 行 ID == 1 和 5 行 ID == 2(总共 9 行)。最简单的方法是什么?

我通常使用 dplyr,所以会接受基本或 dplyr/tidyverse 方法

library(dplyr)
library(lubridate)

dt <- Sys.time() %>% floor_date('hours')
df <- data.frame(ID = c(1, 1, 2, 2), 
                 DateTime = c(dt, dt + hours(3), dt + hours(6), dt + hours(9)),
                 Value = c(3, 3, 4, 4))

预期的输出是:

output <- data.frame(ID = c(1, 1, 1, 1, 2, 2, 2, 2), 
                     DateTime = c(dt, dt + hours(1), dt + hours(2), dt + hours(3), 
                                  dt + hours(6), dt + hours(7), dt + hours(8), dt + hours(9)),
                     Value = c(3, 3, 3, 3, 4, 4, 4, 4))

  ID            DateTime Value
1  1 2018-03-27 19:00:00     3
2  1 2018-03-27 20:00:00     3
3  1 2018-03-27 21:00:00     3
4  1 2018-03-27 22:00:00     3
5  2 2018-03-28 01:00:00     4
6  2 2018-03-28 02:00:00     4
7  2 2018-03-28 03:00:00     4
8  2 2018-03-28 04:00:00     4

【问题讨论】:

  • 我稍微修改了原始的data.frame并提供了预期的输出
  • 我的输出与你的不同,因为时区不同
  • 是的,输出不同,这不是问题。我只需要填写值列以及 ID
  • 如果每个ID的Value列都相同,则使用group_by(ID, Value)
  • 非常感谢。这是一个很好的简单解决方案

标签: r dplyr lubridate posixct seq


【解决方案1】:

我们可以从tidyr使用complete

library(tidyverse)
df %>% 
   group_by(ID, Value) %>% 
   complete(DateTime = seq(min(DateTime), max(DateTime), by = "1 hour")) %>%
   select(names(df)) 

【讨论】:

  • 几乎。此解决方案也不会“完成”“值”列
  • @sebdalgarno 在您的示例中,每个“ID”的值列都是相同的情况。所以,我用了fill
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多