gpt4 book ai didi

r - 查找每月的第一个星期二

转载 作者:行者123 更新时间:2023-12-01 09:14:59 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将日期向量作为输入并返回日期向量——其中输出是与输入日期匹配的每月第一个星期二的日期。

所以 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 并使逻辑更简单一些。给定一个日期向量,第二个函数将返回一个字符向量,类似于您的输入。您可以根据自己的需要进行更改。

library(lubridate)

getTuesday = function(x) {
date = ymd(x)
first = floor_date(date,"month")
dow = sapply(seq(0,6),function(x) wday(first+days(x)))
firstTuesday = first + days(which(dow==3)-1)
return(firstTuesday)
}

getMultipleTuesdays = function(y) {
tmp = lapply(y, getTuesday)
tmp = lapply(tmp, as.character)
return(unlist(tmp))
}

编辑

示例输入/输出

getMultipleTuesdays(c("2012-11-19","2012-11-19","2011-01-15"))
[1] "2012-11-06" "2012-11-06" "2011-01-04"

关于r - 查找每月的第一个星期二,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13448588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com