Select 按日和月的时间段
Select a time period by day and month
我有一个按年组织的数据框。
例如:
日期 <- seq(as.Date("2001-07-20"),as.Date("2010-12-31"),by = 1)
现在我想 select 使用两个时间段的子集:
2004-2008 年为 6 月 23 日至 7 月 13 日和 7 月 20 日至 8 月 9 日。
你能提供一些线索吗?谢谢!
是的,可以通过以下方式解决:
测试[date %between% c("2004-07-20", "2004-08-09")]...
但在我的数据中有很多年,代码可能非常重复。
我想知道是否可以这样解决:
df$md <- 格式(as.Date(df$date), "%m-%d")
df <- df[df$md %in% c(as.Date(06-23):日期(07-13), 日期(07-20):日期(08-09)) & 年份 %in% (2004:2008),]
它不起作用:as.Date.numeric(6 - 23) 中的错误:必须提供 'origin'
您可以构造感兴趣的范围和子集:
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] })))
我有一个按年组织的数据框。
例如:
日期 <- seq(as.Date("2001-07-20"),as.Date("2010-12-31"),by = 1)
现在我想 select 使用两个时间段的子集:
2004-2008 年为 6 月 23 日至 7 月 13 日和 7 月 20 日至 8 月 9 日。
你能提供一些线索吗?谢谢!
是的,可以通过以下方式解决: 测试[date %between% c("2004-07-20", "2004-08-09")]... 但在我的数据中有很多年,代码可能非常重复。 我想知道是否可以这样解决:
df$md <- 格式(as.Date(df$date), "%m-%d") df <- df[df$md %in% c(as.Date(06-23):日期(07-13), 日期(07-20):日期(08-09)) & 年份 %in% (2004:2008),]
它不起作用:as.Date.numeric(6 - 23) 中的错误:必须提供 'origin'
您可以构造感兴趣的范围和子集:
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] })))