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

时间:2017-05-30 22:08:01

标签: r posixct

我正在尝试选择跨越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,只指定感兴趣的时间间隔?或者其他一些计算一段时间内平均值的方法,无论日期如何?

1 个答案:

答案 0 :(得分:0)

您可以使用例如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")

然后使用cut

将您的日期/时间放入投递箱
Data$lev <- cut.POSIXt(Data$dates, breaks = breaks, labels = 1:(length(breaks)-1))

然后只选择那些包含所需组的(奇数)垃圾箱(从17:00:00到05:00:00)

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,这意味着该间隔将向右关闭。你需要相应地调整它。