Со второй по последнюю среду месяца в R - PullRequest
0 голосов
/ 09 марта 2020

В R, как я могу составить список дат от всех 2 до последних сред месяца в указанном диапазоне дат? Я попробовал несколько вещей, но получил противоречивые результаты за месяцы с пятью средами.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Для генерации регулярной последовательности дат вы можете использовать seq с датами для параметра from и to. Подробнее см. В документации seq.Date .

Создайте фрейм данных с датой, месяцем и днем ​​недели. И затем получите вторую-последнюю среду для каждого месяца с помощью aggregate.

day_sequence = seq(as.Date("2020/1/1"), as.Date("2020/12/31"), "day")

df = data.frame(day = day_sequence, 
                month = months(day_sequence), 
                weekday = weekdays(day_sequence))

#Filter only wednesdays
df = df[df$weekday == "Wednesday",]

result = aggregate(day ~ month, df, function(x){head(tail(x,2),1)})

tail(x,2) вернет последние две строки, затем head(.., 1) выдаст вам первую из этих последних два.

Результат:

       month        day
1      April 2020-04-22
2     August 2020-08-19
3   December 2020-12-23
4   February 2020-02-19
5    January 2020-01-22
6       July 2020-07-22
7       June 2020-06-17
8      March 2020-03-18
9        May 2020-05-20
10  November 2020-11-18
11   October 2020-10-21
12 September 2020-09-23
1 голос
/ 09 марта 2020

Вероятно, есть более простые способы сделать это, но функция ниже делает то, что задает вопрос. он возвращает названное векто дней, такое, что

  • Они находятся между from и to.
  • Будущий день day, где 1 - понедельник.
  • являются n до конца месяца.

Под n до конца, я имею в виду n-й отсчет с конца месяца.

whichWeekday <- function(from, to, day, n, format = "%Y-%m-%d"){
  from <- as.Date(from, format = format)
  to <- as.Date(to, format = format)
  day <- as.character(day)
  d <- seq(from, to, by = "days")
  m <- format(d, "%Y-%m")
  f <- c(TRUE, m[-1] != m[-length(m)])
  f <- cumsum(f)
  wed <- tapply(d, f, function(x){
    i <- which(format(x, "%u") == day)
    x[tail(i, n)[1]]
  })
  y <- as.Date(wed, origin = "1970-01-01")
  setNames(y, format(y, "%Y-%m"))
}

whichWeekday("2019-01-01", "2020-03-31", 4, 2)
#     2019-01      2019-02      2019-03      2019-04      2019-05 
#"2019-01-23" "2019-02-20" "2019-03-20" "2019-04-17" "2019-05-22" 
#     2019-06      2019-07      2019-08      2019-09      2019-10 
#"2019-06-19" "2019-07-24" "2019-08-21" "2019-09-18" "2019-10-23" 
#     2019-11      2019-12      2020-01      2020-02      2020-03 
#"2019-11-20" "2019-12-18" "2020-01-22" "2020-02-19" "2020-03-18" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...