获取R中某个特定工作日的日期
问题描述:
如何为每年的每个星期一生成一个日期对象列表(POSIXct或lt)?获取R中某个特定工作日的日期
举例来说,今年将是(以年,月,日):
2012_01_02, 2012_01_09, 2102_01_16, etc
答
编辑:在进一步思考,下面是做同样的事情更清洁的功能:
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"
答
我发现seq.Date
这是base
一部分。不知道是否有警告这种方法,但它似乎做我想做的:
x = seq(as.Date("2012/01/02"), as.Date("2013/01/01"), "7 days")
as.POSIXct(x)
答
as.Date("2012_01_02", format="%Y_%m_%d") +seq(0,366,by=7) # 2012 is a leap year.
如果你真的希望他们与时区的所有随之而来的麻烦,那么你可以用as.POSIXct
强迫他们DateTime是否。
如果你在日期数学的土地上花费很多时间,我也会熟悉哈德利的'lubridate'软件包。它有一些很棒的功能来做这种事情。 'as.POSIXct('2012-01-02')+ 1:52 * new_duration(days = 7)' – Justin 2012-02-06 20:21:57