由数据框中的列定义的时间段的开始和结束日期

Start and end dates of time periods defined by a column in a data frame

我有一个按行组织的每小时数据数据库,我想重塑它,以便在数据符合特定条件时获取开始和结束时间

考虑以下案例,一列是连续的每小时时间,第二列是虚拟变量数据。

Yrs=  data.frame(Date=seq(as.POSIXct("2019-02-04 01:00:00",tz="UTC"), as.POSIXct("2019-02-04 23:00:00",tz="UTC"), by="hour"))
Yrs$Var=c(1:12,1:11)

我想获取变量介于 3 和 7 之间的时间段的开始和结束日期。

预期结果:

StartDate               EndDate
2019-02-04 03:00:00     2019-02-04 07:00:00
2019-02-04 15:00:00     2019-02-04 19:00:00

我想我可以创建一个新列来指示满足条件的行,但不知道如何获取这些连续期间的开始和结束

Yrs$Period= ifelse(Yrs$Var >= 3 & Yrs$Var <=7, 1, 0)

我在这里找到了这个问题的反例 但我正在努力解决这个问题。任何帮助将不胜感激。

可能是这样的:

library(data.table)
setDT(Yrs)[, .(StartDate=Date[Var==3L], EndDate=Date[Var==7L]), 
    by=.(c(0L, cumsum(diff(Var) < 1L)))][, -1L]

输出:

             StartDate             EndDate
1: 2019-02-04 03:00:00 2019-02-04 07:00:00
2: 2019-02-04 15:00:00 2019-02-04 19:00:00

为什么不 filterspread

library(dplyr)

Yrs %>%
  filter(Var == 3 | Var == 7) %>%
  group_by(Var) %>%
  mutate(ind = row_number()) %>%
  spread(Var, Date) %>%
  select(-ind) %>%
  rename_all(funs(c("Start_Date", "End_Date")))

#  Start_Date          End_Date           
#  <dttm>              <dttm>             
#1 2019-02-04 03:00:00 2019-02-04 07:00:00
#2 2019-02-04 15:00:00 2019-02-04 19:00:00