2016-01-03 7 views

ответ

10

Мы можем использовать lubridate, wday, чтобы проверить, если это понедельник, и day, чтобы проверить, если это первая неделя месяца:

library(lubridate) 
x <- seq(ymd("2010-01-01"),ymd("2015-12-31"),by="1 day") 
x[wday(x,label = TRUE) == "Mon" & day(x) <= 7] 

или в базовой г (@ комментарий DavidArenburg в)

x <- seq(as.Date("2010-01-01"), as.Date("2015-12-31"), by = "day") 
# You need to adapt "Monday" to the equivalent in your locale 
x[weekdays(x) == "Monday" & as.numeric(format(x, "%d")) <= 7] 

выход (пять) первые результаты

[1] "2010-01-04 UTC" "2010-02-01 UTC" "2010-03-01 UTC" "2010-04-05 UTC" "2010-05-03 UTC" "2010-06-07 UTC" 
+6

Или просто 'x <- seq (as. Дата («2010-01-01»), as.Date («2015-12-31»), на = «день»); x [weekdays (x) == "Monday" & as.numeric (format (x, "% d")) <= 7] 'с базой R –

5

Еще одна оценка: с использованием библиотеки Boost Date_Time:

library(RcppBDT) 
dates <- seq(as.Date("2010-01-01"), as.Date("2015-12-31"), by="1 month") 
do.call(c, lapply(dates-1, getFirstDayOfWeekAfter, dow=Mon)) 
# [1] "2010-01-04" "2010-02-01" "2010-03-01" "2010-04-05" "2010-05-03"... 
4

Вот базовое решение R. Это требует только трех строк кода. В zoo quickref vignette есть функция с одной строкой, nextfri, чтобы получить следующую пятницу или после указанной даты. Если мы заменим каждую 5 (пятницу) на 1 (понедельник) в теле этой функции, мы получим следующий понедельник или после определенной даты. (Формула там не включает origin аргумента, который используется здесь, поскольку зоопарк позволяет ему быть опущен, однако, здесь мы включаем его так, что он работает без каких-либо пакетов.)

# given "Date" class vector x return same date if Mon or next Mon if not 
nextmon <- function(x) 7 * ceiling(as.numeric(x-1+4)/7) + as.Date(1-4, origin="1970-01-01") 

# all first of months between the indicated dates 
firsts <- seq(as.Date("2010-01-01"), as.Date("2015-12-31"), "month") 

# first Monday in each month 
nextmon(firsts) 

`даяние:

[1] "2010-01-04" "2010-02-01" "2010-03-01" "2010-04-05" "2010-05-03" 
[6] "2010-06-07" "2010-07-05" "2010-08-02" "2010-09-06" "2010-10-04" 
[11] "2010-11-01" "2010-12-06" "2011-01-03" "2011-02-07" "2011-03-07" 
[16] "2011-04-04" "2011-05-02" "2011-06-06" "2011-07-04" "2011-08-01" 
[21] "2011-09-05" "2011-10-03" "2011-11-07" "2011-12-05" "2012-01-02" 
[26] "2012-02-06" "2012-03-05" "2012-04-02" "2012-05-07" "2012-06-04" 
[31] "2012-07-02" "2012-08-06" "2012-09-03" "2012-10-01" "2012-11-05" 
[36] "2012-12-03" "2013-01-07" "2013-02-04" "2013-03-04" "2013-04-01" 
[41] "2013-05-06" "2013-06-03" "2013-07-01" "2013-08-05" "2013-09-02" 
[46] "2013-10-07" "2013-11-04" "2013-12-02" "2014-01-06" "2014-02-03" 
[51] "2014-03-03" "2014-04-07" "2014-05-05" "2014-06-02" "2014-07-07" 
[56] "2014-08-04" "2014-09-01" "2014-10-06" "2014-11-03" "2014-12-01" 
[61] "2015-01-05" "2015-02-02" "2015-03-02" "2015-04-06" "2015-05-04" 
[66] "2015-06-01" "2015-07-06" "2015-08-03" "2015-09-07" "2015-10-05" 
[71] "2015-11-02" "2015-12-07"