如何在R中获得每三个月的每个第三个星期五

时间:2020-07-14 14:26:49

标签: r

尝试获取一年中从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月的第三个星期五?

3 个答案:

答案 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