Я знаю, что могу использовать POSIXct в dplyr:filter
в качестве аргумента. Я успешно сократил свои данные, используя такие аргументы, как> =. Вот мой код:
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:00, но я не мог понять рабочий синтаксис для этого.
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 часами.