【发布时间】:2012-11-19 06:15:57
【问题描述】:
我正在尝试编写一个函数,该函数将日期向量作为输入并返回日期向量——其中输出是与输入日期匹配的每月第一个星期二的日期。
所以2012-11-19 --> 2012-11-06等
我在单个日期上取得了一些成功,但无法推广到矢量情况。有人可以帮忙吗?
这是我目前所拥有的:
firstTuesday <- function(tt){
ct <- as.POSIXct(tt)
lt <- as.POSIXlt(tt)
firstOf <- as.POSIXlt(ct - 60*60*24* (lt$mday - 1))
if (firstOf$wday > 2)
{
adjDays <- (9 - firstOf$wday)
firstTues <- as.POSIXlt(as.POSIXct(firstOf) + 60*60*24*adjDays)
}
else {
adjDays <- (2 - firstOf$wday)
firstTues <- as.POSIXlt(as.POSIXct(firstOf) + 60*60*24*adjDays)
}
return(firstTues)
}
这适用于单个日期:firstTuesday(Sys.Date()) 但会为日期向量产生垃圾(我认为,由于if 不是向量化控制运算符的问题)。
我通过使用索引来解决我有限的理解。以下代码似乎可以解决问题。
firstTuesday <- function(tt){
ct <- as.POSIXct(tt)
lt <- as.POSIXlt(tt)
firstOf <- as.POSIXlt(ct - 60*60*24* (lt$mday - 1))
firstTue <- as.POSIXct(firstOf)
idx <- firstOf$wday > 2
firstTue[idx] <- as.POSIXct(firstOf[idx]) + 60*60*24*(9 - firstOf$wday[idx])
firstTue[!idx] <- as.POSIXct(firstOf[!idx]) + 60*60*24*(2 - firstOf$wday[!idx])
return(firstTue)
}
【问题讨论】:
-
如果您使用时间和日期,我强烈推荐使用 lubridate 包。
-
谢谢——也许我会的。我不愿意添加新的包依赖项,但也许这是值得的。