使用多天参数从 POSIXct 过滤一天中的特定时间(时间跨度)

filter for specific time of day (timespan) from POSIXct with argument for multiple days

我知道我可以在 dplyr:filter 中使用 POSIXct 作为参数。我已经通过使用 >= 这样的参数成功地缩短了我的数据。这是我的代码:

library (dplyr)
start <- as.POSIXct("2018-05-18 00:00")
tseq <- seq(from = start, length.out = 1440, by = "10 mins")
observations <- data.frame(
  Time = tseq,
  Temp = sample(10:37,1440, replace = TRUE, set.seed(seed = 10)),
  Variable1 = sample(1:200,1440, replace = TRUE, set.seed(seed = 187)),
  Variable2 = sample(300:800,1440, replace = TRUE, set.seed(seed = 333))
)

observations_short <- observations %>% filter (Time <=  as.POSIXct ("2018-05-23 00:00", tz="CET") )

我假设像这样的东西应该可以过滤每天 9:00 到 17:00h 的值,但我无法弄清楚它的工作语法。

    observations_9to5 <- observations %>% filter (Time >=  as.POSIXct ("09:00", tz="CET") ) %>% filter (Time <=  as.POSIXct ("17:00", tz="CET") )

帮助语法,如果这通常适用于 dplyr::filter 将不胜感激。如果这对 dplyr 不起作用,是否可以对 xts 格式的数据进行处理?

lubridate 做到这一点非常简单。我们提取 hour 组件并相应地进行比较。

library(lubridate)
library(dplyr)

observations %>%
    filter(hour(Time) >= 9 & hour(Time) < 17)


#                  Time Temp Variable1 Variable2
#1   2018-05-18 09:00:00   15       113       782
#2   2018-05-18 09:10:00   26        30       379
#3   2018-05-18 09:20:00   22       136       630
#4   2018-05-18 09:30:00   23        49       781
#....

或者,如果您想继续使用 as.POSIXct 方法,它会稍微复杂一些,类似于

observations %>%
     filter(as.POSIXct(format(Time, "%H:%M:%S"), format = "%H:%M:%S") >= 
                      as.POSIXct("09:00:00", format = "%H:%M:%S") &
            as.POSIXct(format(Time, "%H:%M:%S"), format = "%H:%M:%S") < 
                    as.POSIXct("17:00:00", format = "%H:%M:%S"))

在这里,我们使用format提取时间成分,然后将其转换回POSIXct格式,然后将其与9小时和17小时进行比较。