2011-03-01 44 views
3

给定一个随机的开始和结束日期,如何创建一个新的序列(或修改这个序列)以在第一个星期一开始并在上个星期五结束?周一起始顺序,周五结束

MyDays <- seq(StartDate , EndDate , by = "day") 
SequenceDay <- days [!is.weekend(MyDays)] 

谢谢!

+4

要添加到@Joshua所说的,SO的角色之一是其他人的可搜索资源。如果你不接受解决你的问题的答案,任何遇到你问题的人都不知道答案是否有帮助。如果提供的答案中没有提供帮助,请对其进行评论,以讨论哪些问题是错误的,以便找到解决方案。要接受答案,请选中答案测试左侧的大记号标记,并在答案的投票数下方。 – 2011-03-01 20:35:38

+0

@Gavin:你总是比我更有帮助! – 2011-03-01 20:36:58

回答

3

与Tony Breyal的回答相似。请注意,如果您的系统在一周中使用英语拼写,这些功能才有效。

StartDate <- as.Date("2010-01-01") 
EndDate <- as.Date("2010-12-31") 
myDays <- seq(StartDate , EndDate, by = "day") 
excludeDays <- c("Saturday", "Sunday") 
myWeekDays <- subset(myDays, !weekdays(myDays) %in% excludeDays) 
firstMonday <- which(weekdays(head(myWeekDays, 5)) == "Monday") 
lastFriday <- length(myWeekDays) - 5 + 
       which(weekdays(tail(myWeekDays, 5)) == "Friday") 
myCompleteWeeks <- myWeekDays[firstMonday:lastFriday] 
+0

+1我更喜欢你的答案,很好的使用子集,头部和尾部功能,我应该更频繁地使用它们,非常有用:) – 2011-03-01 21:31:41

+0

谢谢。这正是我所需要的,并且很容易融入到我的程序中。 (就像这样!)我需要找到一个很好的解释你使用%in%的方式。那个逃避了我。 – LGTrader 2011-03-01 21:50:19

+0

@LGTrader:from'?“%in%”':“%in%...返回一个逻辑向量,指示其左操作数是否匹配。换句话说,我用它来得到一个包含TRUE/FALSE答案的向量,在整个'myDays'向量中重复:'myDays'这个元素的日期名称在周末日的向量中具有匹配值名字呢?因为我实际上想保留非匹配而不是匹配,所以使用'!'来否定'%in%'返回的逻辑向量。 – 2011-03-02 00:51:49

2

假设我的理解正确的('目前那朵工作日结束,我在酒吧),那么这个怎么样:

# set start and end dates 
n <- 31 
d.start <- Sys.Date() 
d.end <- d.start + n 

# workhorse code 
my.seq = seq(d.start, d.end, "days") 
x1 <- weekdays(my.seq) 
first.Mon <- which(x1=="Monday")[1] 
last.friday <- which(x1=="Friday")[length(which(x1=="Friday"))] 
x <- my.seq[first.Mon:last.Fri] 
ind.sats <- which(weekdays(x) == "Saturday") 
ind.suns <- which(weekdays(x) == "Sunday") 
x <- x[-c(ind.sats, ind.suns)] 

这应该给你:

> x 
[1] "2011-03-07" "2011-03-08" "2011-03-09" "2011-03-10" "2011-03-11" 
[6] "2011-03-14" "2011-03-15" "2011-03-16" "2011-03-17" "2011-03-18" 
[11] "2011-03-21" "2011-03-22" "2011-03-23" "2011-03-24" "2011-03-25" 
[16] "2011-03-28" "2011-03-29" "2011-03-30" "2011-03-31" "2011-04-01" 

> weekdays(x) 
[1] "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Monday" 
[7] "Tuesday" "Wednesday" "Thursday" "Friday" "Monday" "Tuesday" 
[13] "Wednesday" "Thursday" "Friday" "Monday" "Tuesday" "Wednesday" 
[19] "Thursday" "Friday" 

取决于你想要什么。无论如何,这是基本的想法,你可能需要添加一些错误检查。

3

POSIXlt为您提供了一种语言无关的方式。 match()rev()比较容易一点。 chron包中包含功能is.weekend()。使用温彻斯特的矢量myDays:

myDays <- as.POSIXlt(myDays) 
wdays <- myDays$wday 
n <- length(myDays)+1 

myDays <- myDays[match(1,wdays):(n-match(5,rev(wdays)))] 

要排除的周末,你可以使用克隆氏病库

library(chron) 
myDays[!is.weekend(myDays)] 

这适用于POSIXt,日期和chron的对象,这样你就可以独立使用它的其他代码。使用POSIXlt,您可以再次使用百分比%:

myDays[! myDays$wday %in% c(0,6)] 
相关问题