我正在尝试选择跨越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,只指定感兴趣的时间间隔?或者其他一些计算一段时间内平均值的方法,无论日期如何?
答案 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,这意味着该间隔将向右关闭。你需要相应地调整它。