当时间范围跨越两个日期时,如何 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,表示区间会向右闭合。您需要相应地进行调整。
我正在尝试 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,表示区间会向右闭合。您需要相应地进行调整。