尝试获取一年中从2018年到2020年的每个三个月(3月,6月,9月,12月)的第三个星期五的日期。但是,我当前的代码仅给我每个第三个星期五的日期。因此,b
的输出实际上将给我两个2018年6月的星期五约会。请参见下面的代码:
allDates = seq(from = as.Date("2018-01-01"), to = as.Date("2020-07-01"), by = "days")
df = data.frame(allDates)
df$Date = weekdays(df$allDates)
Day = data.frame()
fridays = data.frame()
a = df[month(allDates)%in%c(2,5,8,11) & weekday(allDates)==5,]
b = a[seq(from = 3, to = nrow(a), by = 3),]
然后我将如何为特定日期分配不同的变量?例如,x = 3月和9月的第三个星期五,y = 3月,6月,9月和12月的第三个星期五?
答案 0 :(得分:1)
以下基本R代码输出所需月份的第三个星期五。输出的月份名称在我当前的语言环境中,但是代码本身并不依赖于此。
friday3 <- function(start.year, end.year){
d <- seq(ISOdate(start.year - 1, 12, 1), ISOdate(end.year, 12, 1), by = "3 month")[-1]
d <- as.Date(d)
res <- lapply(d, function(x){
s <- seq(x, by = "day", length.out = 28)
i <- format(s, "%u") == "5"
s[i][3]
})
res <- Reduce(c, res)
data.frame(Month = format(d, "%Y-%B"), Day = res)
}
我的语言环境不是英语,因此我必须设置英语语言环境来进行测试,但是代码本身并不依赖于语言环境。
#ol <- Sys.getlocale("LC_TIME")
#Sys.setlocale("LC_TIME", "en_US.UTF-8")
friday3(2018, 2020)
# Month Day
#1 2018-March 2018-03-16
#2 2018-June 2018-06-15
#3 2018-September 2018-09-21
#4 2018-December 2018-12-21
#5 2019-March 2019-03-15
#6 2019-June 2019-06-21
#7 2019-September 2019-09-20
#8 2019-December 2019-12-20
#9 2020-March 2020-03-20
#10 2020-June 2020-06-19
#11 2020-September 2020-09-18
#12 2020-December 2020-12-18
回到我的身边。
#Sys.setlocale("LC_TIME", ol)
答案 1 :(得分:0)
您是否正在寻找类似的东西? (数据基于代码的前三行)。
三个重要参数是您要过滤的 month 和 date (c(3,6,9,12)
中的'Friday'
和filter(month(allDates)%in%c(3,6,9,12) & Date == 'Friday')
)和一天的 n 个位置(3
中的summarise(col=nth(allDates,3))
)。
library(lubridate)
library(dplyr)
df %>%
filter(month(allDates)%in%c(3,6,9,12) & Date == 'Friday') %>%
mutate(month=month(allDates),
year=year(allDates)) %>%
group_by(year,month) %>%
summarise(col=nth(allDates,3))
# A tibble: 10 x 3
# Groups: year [3]
year month col
<dbl> <dbl> <date>
1 2018 3 2018-03-16
2 2018 6 2018-06-15
3 2018 9 2018-09-21
4 2018 12 2018-12-21
5 2019 3 2019-03-15
6 2019 6 2019-06-21
7 2019 9 2019-09-20
8 2019 12 2019-12-20
9 2020 3 2020-03-20
10 2020 6 2020-06-19
答案 2 :(得分:0)
首先,我们创建一个month列,该列从allDates列中提取月份。软件包lubridate和function month()用于此目的
此后,我们过滤您要求的月份(3月,6月,9月,12月)和星期五。
此后,我们计算row_nr。此列很有用,因为我们可以在以后每三个星期五应用模运算符。
然后,从先前指定的月份的第三个星期五选择符合条件的相关案例。
library(tidyverse)
library(lubridate)
fridays <- df %>%
mutate(month = month(allDates)) %>%
filter(month %in% c(3, 6, 9, 12), Date == "Friday") %>%
group_by(month) %>%
mutate(row_nr = row_number(),
relevant = ifelse(row_nr%%3 == 0, 1, 0)) %>%
filter(relevant == 1)
fridays
# A tibble: 12 x 5
# Groups: month [4]
allDates Date month row_nr relevant
<date> <chr> <dbl> <int> <dbl>
1 2018-03-16 Friday 3 3 1
2 2018-06-15 Friday 6 3 1
3 2018-09-21 Friday 9 3 1
4 2018-12-21 Friday 12 3 1
5 2019-03-01 Friday 3 6 1
6 2019-03-22 Friday 3 9 1
7 2019-06-07 Friday 6 6 1
8 2019-06-28 Friday 6 9 1
9 2019-09-13 Friday 9 6 1
10 2019-12-13 Friday 12 6 1
11 2020-03-13 Friday 3 12 1
12 2020-06-19 Friday 6 12 1