2013-12-19 34 views

回答

4

我敢肯定有一个更简单的方法,但你可以蛮力它足够简单:

dates <- seq.Date(as.Date("2013-01-01"),as.Date("2013-12-31"),by="1 day") 

dates[weekdays(dates)=="Friday"] 
dates[format(dates,"%w")==5] 

大厦@弗兰克的良好的工作,你可以找到所有的任何具体工作日的,像这样两个日期之间:

pick.wkday <- function(selday,start,end) { 
    fwd.7 <- start + 0:6 
    first.day <- fwd.7[as.numeric(format(fwd.7,"%w"))==selday] 
    seq.Date(first.day,end,by="week") 
} 

startend必须Date对象,selday是你想要的一周(0-6代表周日到周六)的日子。

即 - 当前查询:

pick.wkday(5,as.Date("2013-01-01"),as.Date("2013-12-31")) 
5

这是一种方式。

d <- as.Date(1:365, origin = "2013-1-1") 
d[strftime(d,"%A") == "Friday"] 

或者,这将是一个更有效的方法生成的数据周五的任意数量:

wk1 <- as.Date(seq(1:7), origin = "2013-1-1") # choose start date & make 7 consecutive days 
wk1[weekdays(wk1) == "Friday"]    # find Friday in the sequence of 7 days 

seq.Date(wk1[weekdays(wk1) == "Friday"], length.out=50, by=7) # use it to generate fridays 

by=7说去到下周五。 length.out控制要生成的星期五的数量。人们还可以使用to来控制生成多少个星期五(例如使用to=as.Date("2013-12-31")而不是length.out)。

+1

我已经把你的例子作为一个函数到我的答案 - 适用于任意的开始和结束点。 – thelatemail

2

有可能是更优雅的方式来做到这一点,但这里有一种方法来生成一个星期五的矢量,给定任何一年。

year = 2007 
st <- as.POSIXlt(paste0(year, "/1/01")) 
en <- as.Date(paste0(year, "/12/31")) 

#get to the next Friday 
skip_ahead <- 5 - st$wday 
if(st$wday == 6) skip_ahead <- 6 #for Saturdays, skip 6 days ahead. 

first.friday <- as.Date(st) + skip_ahead 
dates <- seq(first.friday, to=en, by ="7 days") 

dates 
#[1] "2007-01-05" "2007-01-12" "2007-01-19" "2007-01-26" 
# [5] "2007-02-02" "2007-02-09" "2007-02-16" "2007-02-23" 
# [9] "2007-03-02" "2007-03-09" "2007-03-16" "2007-03-23" 
2

需要一年作为输入并返回只有周五...

getFridays <- function(year) {  
    dates <- seq(as.Date(paste0(year,"-01-01")),as.Date(paste0(year,"-12-31")), by = "day") 
    dates[weekdays(dates) == "Friday"]  
} 

例子:

> getFridays(2000) 
[1] "2000-01-07" "2000-01-14" "2000-01-21" "2000-01-28" "2000-02-04" "2000-02-11" "2000-02-18" "2000-02-25" "2000-03-03" "2000-03-10" "2000-03-17" "2000-03-24" "2000-03-31" 
[14] "2000-04-07" "2000-04-14" "2000-04-21" "2000-04-28" "2000-05-05" "2000-05-12" "2000-05-19" "2000-05-26" "2000-06-02" "2000-06-09" "2000-06-16" "2000-06-23" "2000-06-30" 
[27] "2000-07-07" "2000-07-14" "2000-07-21" "2000-07-28" "2000-08-04" "2000-08-11" "2000-08-18" "2000-08-25" "2000-09-01" "2000-09-08" "2000-09-15" "2000-09-22" "2000-09-29" 
[40] "2000-10-06" "2000-10-13" "2000-10-20" "2000-10-27" "2000-11-03" "2000-11-10" "2000-11-17" "2000-11-24" "2000-12-01" "2000-12-08" "2000-12-15" "2000-12-22" "2000-12-29" 
2

我认为这将是最有效的方式,并也将返回所有在整个2013年的星期五。

FirstWeek <- seq(as.Date("2013/1/1"), as.Date("2013/1/7"), "days") 
seq(
    FirstWeek[weekdays(FirstWeek) == "Friday"], 
    as.Date("2013/12/31"), 
    by = "week" 
) 
相关问题