【问题标题】:How to get every third Friday of every third month in R如何在R中获得每三个月的第三个星期五
【发布时间】:2020-07-14 14:26:49
【问题描述】:

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

【问题讨论】:

  • c(2,5,8,11) 不是三月,5 不是六月。对吗?
  • 我以为月份是从 0 开始的?即,0 = 一月,1 = 二月,...,十二月 = 11
  • help('strptime') format "%m" 表示月份为十进制数 (01–12)。

标签: r


【解决方案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)

【讨论】:

    【解决方案2】:

    您正在寻找这样的东西吗? (数据基于代码的前三行)。

    三个重要参数是您要过滤的日期c(3,6,9,12)'Friday' in filter(month(allDates)%in%c(3,6,9,12) &amp; Date == 'Friday'))和nth 当天的位置(summarise(col=nth(allDates,3)) 中的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
    

    【讨论】:

      【解决方案3】:

      首先,我们创建一个从 allDates 列中提取月份的月份列。包 lubridate 和函数 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
      

      【讨论】:

      • 您是否检查过此代码是否有效?显示 head(fridays) 以证明您的代码回答了问题。注意 Stack Overflow 是一个英文网站;我怀疑Date == "Freitag" 可能只适用于德语数据框。
      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      猜你喜欢
      • 2023-03-21
      • 2019-02-12
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      相关资源
      最近更新 更多