Начало последовательности в понедельник, конец в пятницу - PullRequest
3 голосов
/ 01 марта 2011

Учитывая случайные даты начала и окончания, как я могу создать новую последовательность (или изменить эту), чтобы она начиналась в первый понедельник и заканчивалась в последнюю пятницу?

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

Спасибо! * * 1004

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Аналогично ответу Тони Бреял.Имейте в виду, что они работают только в том случае, если ваша система использует орфографические выражения английского языка для дней недели.

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]
3 голосов
/ 02 марта 2011

POSIXlt дает вам независимый от языка способ.match() и rev() облегчают сравнение.Пакет chron содержит функцию is.weekend().Используя вектор myDays of Winchester:

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

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

Чтобы исключить выходные, вы можете использовать библиотеку chron

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

. Это работает с объектами POSIXt, Date и chron, поэтому вы можете использоватьэто независимо от другого кода.С POSIXlt вы также можете снова использовать% в%:

myDays[! myDays$wday %in% c(0,6)]
2 голосов
/ 01 марта 2011

Если я правильно понял (в настоящее время конец рабочего дня и я в пабе), то как насчет этого:

# 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"

В зависимости от того, что вы хотели. В любом случае, это основная идея, вам, вероятно, потребуется добавить проверку ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...