Как получить каждую третью пятницу каждого третьего месяца в R - PullRequest
1 голос
/ 14 июля 2020

Пытаюсь получить дату третьей пятницы каждые три месяца в году (март, июнь, сентябрь, декабрь c) с 2018 по 2020 год. Однако мой текущий код выдает мне только каждую третью пятницу. Таким образом, результат b фактически даст мне две даты пятницы в июне 2018 года. См. Код ниже:

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),]

Как мне затем назначить разные переменные для указанных c дат? например, x = третья пятница марта и сентября и y = третья пятница марта, июня, сентября и De c?

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Следующий базовый код R выводит 3-ю пятницу необходимых месяцев. Названия выходных месяцев указаны в моем текущем языковом стандарте, но сам код не зависит от него.

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)
}

Мой языковой стандарт - не английский sh, поэтому мне нужно установить языковой стандарт Engli sh на протестируйте его, но сам код не зависит от локали.

#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)
0 голосов
/ 14 июля 2020

Прежде всего, мы создаем столбец месяца, который извлекает месяц из столбца allDates. Для этого используется пакет lubridate и функция month ()

После этого мы фильтруем месяцы, которые вы запросили (март, июнь, сентябрь, декабрь) и день пятницы.

После этого вычисляем 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
0 голосов
/ 14 июля 2020

Вы ищете что-то подобное? (данные основаны на трех первых строках вашего кода).

Три важных параметра - это месяц и дата , которые вы хотите отфильтровать (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...