使用多天参数从 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小时进行比较。
我知道我可以在 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小时进行比较。