当时间范围跨越两个日期时,如何 select POSIXct 格式的时间范围?

How to select time range in POSIXct format when time range spans two dates?

我正在尝试 select 跨越 2 天的时间范围(例如 2011-01-01 17:00:00 到 2011-01-02 05:00:00)来计算该时间间隔内某些变量(例如风速)的平均值。

示例数据:

## Create a record and some random data for every 15 min 
## over 10 days for windspeed.
dates <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
         as.POSIXct("2011-01-10 23:59:00", tz = "GMT"),
         by = 900)
windspeed <- sample(0:20, length(dates), replace = TRUE)
Data  <- data.frame(dates = dates, windspeed = windspeed)

我能够使用 dplyr 包从我的数据集中过滤我感兴趣的日期:

Data %>%
filter(dates > ymd_hms("2011-01-01 00:00:00", tz = GMT) & dates < ymd_hms("2011-01-04 00:00:00", tz = GMT) | dates > ymd_hms("2011-01-06 00:00:00", tz = GMT) & dates < ymd_hms("2011-01-010 00:00:00", tz = GMT))

是否可以使用通配符代替上述代码中的 DATE 并仅指定感兴趣的时间间隔?或者不管日期如何计算一段时间内平均值的其他方法?

您可以创建一个新列来指定 date/time 是否属于给定的区间,例如 cut.POSIXt():

我们首先创建一些中断以根据您的最小和最大 POSIXts 创建间隔:

breaks <- seq(floor_date(min(Data$dates), unit = "days") + hms("17:00:00"), ceiling_date(max(Data$dates), unit = "days"), by = "12 hour")

然后将您的 date/time 放入 cut 的垃圾箱中:

Data$lev <- cut.POSIXt(Data$dates, breaks = breaks, labels = 1:(length(breaks)-1))

然后 select 那些包含所需组(从 17:00:00 到 05:00:00)的(奇数)bin

filter(Data, lev %in% seq(1 , max( as.numeric(as.character(unique(Data$lev))), na.rm = T ), by =2) )%>% 
  group_by(lev) %>% summarise(means  = mean(windspeed))

     lev     means
1      1 10.416667
2      3 10.625000
3      5 11.000000
4      7  9.979167
5      9 11.104167
6     11  9.562500
7     13  9.895833
8     15  9.937500
9     17 10.625000

PS,cut()默认设置为right=TRUE,表示区间会向右闭合。您需要相应地进行调整。