按日和月选择时间段

时间:2019-03-08 00:30:34

标签: r time period

我有一个按年份组织的数据框。 例如: 日期<-seq(as.Date(“ 2001-07-20”),as.Date(“ 2010-12-31”),by = 1)
现在,我想使用两个时间段来选择一个子集: 2004-2008年的6月23日至7月13日以及7月20日至8月9日。 你能提供一些线索吗?谢谢!

是的,可以通过以下方法解决: 测试[日期%weenween%c(“ 2004-07-20”,“ 2004-08-09”)] ... 但是在我的数据中有很多年,代码可能非常重复。 我想知道它是否可以解决:

df $ md <-格式(日期(df $ date),“%m-%d”) df <-df [df $ md%in%c(as.Date(06-23):Date(07-13),Date(07-20):Date(08-09))&year%in%(2004 :2008),]

它不起作用:as.Date.numeric(6-23)中的错误:必须提供'origin'

1 个答案:

答案 0 :(得分:1)

您可以构建兴趣范围和子集:

library(lubridate)    
date <- seq(as.Date("2001-07-20",origin="1970-01-01"),as.Date("2010-12-31",origin="1970-01-01"),by = 1) 

range1 <- as.Date(unlist(lapply(c(0:4),function(y) seq(as.Date("2004-06-23",origin="1970-01-01"),as.Date("2004-07-13",origin="1970-01-01"),by="1 day") + years(y))),origin="1970-01-01")
range2 <- as.Date(unlist(lapply(c(0:4),function(y) seq(as.Date("2004-07-20",origin="1970-01-01"),as.Date("2004-08-09",origin="1970-01-01"),by="1 day") + years(y))),origin="1970-01-01")

date[date %in% range1 | date %in% range2]

替代

使用OP中建议的%between%的替代答案

library(lubridate)
dates <- seq(as.Date("2001-07-20"),as.Date("2010-12-31"),by = 1)

r1 <- c(as.Date("2004-06-23"),as.Date("2004-07-13"))
r2 <- c(as.Date("2004-07-20"),as.Date("2004-08-09"))

ranges <- lapply(c(0:4),function(y) list(r1=r1 + years(y),r2=r2+years(y)))
as.Date(unlist(lapply(ranges,function(r) { dates[dates %between% r$r1 | dates %between% r$r2] })))