2012-02-06 52 views

回答

4

编辑:在进一步思考,下面是做同样的事情更清洁的功能:

getAllMondays <- function(year) { 
    days <- as.POSIXlt(paste(year, 1:366, sep="-"), format="%Y-%j") 
    Ms <- days[days$wday==1] 
    Ms[!is.na(Ms)] # Needed to remove NA from day 366 in non-leap years 
} 
getAllMondays(2012) 

下面是将执行的更一般的任务功能找到的第一个星期一在任意一年,然后在那一年将其列入所有其他星期一。它使用seq.POSIXt()和参数by = "week"(也可用于seq.Date())。

getAllMondays <- function(year) { 
    day1 <- as.POSIXlt(paste(year, "01-01", sep="-")) 
    day365 <- as.POSIXlt(paste(year, "12-31", sep="-")) 

    # Find the first Monday of year 
    week1 <- as.POSIXlt(seq(day1, length.out=7, by="day")) 
    monday1 <- week1[week1$wday == 1] 

    # Return all Mondays in year 
    seq(monday1, day365, by="week") 
} 

head(getAllMondays(2012)) 
# [1] "2012-01-02 PST" "2012-01-09 PST" "2012-01-16 PST" "2012-01-23 PST" 
# [5] "2012-01-30 PST" "2012-02-06 PST" 
2

我发现seq.Date这是base一部分。不知道是否有警告这种方法,但它似乎做我想做的:

x = seq(as.Date("2012/01/02"), as.Date("2013/01/01"), "7 days") 
as.POSIXct(x) 
+1

如果你在日期数学的土地上花费很多时间,我也会熟悉哈德利的'lubridate'软件包。它有一些很棒的功能来做这种事情。 'as.POSIXct('2012-01-02')+ 1:52 * new_duration(days = 7)' – Justin 2012-02-06 20:21:57

1
as.Date("2012_01_02", format="%Y_%m_%d") +seq(0,366,by=7) # 2012 is a leap year. 

如果你真的希望他们与时区的所有随之而来的麻烦,那么你可以用as.POSIXct强迫他们DateTime是否。

相关问题