从R中的一年获得某个工作日的日期

时间:2012-02-06 20:01:22

标签: r

如何为一年中的每个星期一生成日期对象列表(POSIXct或lt)?

例如,今年将是(年,月,日):

2012_01_02,
2012_01_09,
2102_01_16,
etc

3 个答案:

答案 0 :(得分:5)

编辑:进一步思考,这是一个更清晰的功能,可以做同样的事情:

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"

答案 1 :(得分:2)

我发现seq.Datebase的一部分。不确定这个方法是否有警告,但似乎做了我想要的事情:

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

答案 2 :(得分:1)

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

如果您确实希望将它们作为DateTimes以及所有随之而来的时区麻烦,那么您可以使用as.POSIXct强制它们。