Как я могу получить первый рабочий день следующего месяца в г - PullRequest
0 голосов
/ 27 февраля 2019

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

Сначала я создаю справочную таблицу, в которой перечислены все первые рабочие дни:

closedaylookup <-subset (closedaylookup, month.name = "March") </p>

names (closedaylookup) <- c ("month", "firstbday") </p>

closedaylookup

месяц первого дня

1 января 2019-01-02

2 февраля 2019-02-01

3 марта 2019-03-01

4 апреля 2019-04-01

5 мая 2019-05-01

6 июня 2019-06-03

7 июля 2019-07-01

8 августа 2019-08-01

9 сентября 2019-09-03

10 октября 2019-10-01

11 ноября 2019-11-01

12 декабря 2019-12-02

затем я создаю вектор для следующего месяца

date_vector <- function (x) {+as.Date (формат (x + 32, "% Y-% m-01"))} </p>

формат (дата_вектор (Sys.Date ()), "% B")

[1] «Март»

Тогда я застрял, так как понятия не имею, как построить вектор, который использует и date_vector, и таблицу поиска

Моя цель - создать элемент значения, который показывает первыйрабочий день следующего месяца.Я использую это как элемент для другого анализа

Кто-нибудь может мне помочь?Спасибо,

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Используя tidyverse и lubridate, вы можете легко обрабатывать и объединять два списка дат:

(data_org <- (tibble(org = ymd(c("2018-12-21", "2019-01-01", "2019-01-31", "2019-02-15"))) %>%
  mutate(month = month(org),
         year = year(org))))

# A tibble: 4 x 3
  org        month  year
  <date>     <dbl> <dbl>
1 2018-12-21    12  2018
2 2019-01-01     1  2019
3 2019-01-31     1  2019
4 2019-02-15     2  2019

(data_fbd <- tibble(fbd = ymd(c("2019-01-02", "2019-02-01", "2019-03-01", "2019-04-01"))) %>%
  mutate(month = month(fbd) - 1, # adapt month to previous month
         year = year(fbd)) %>%
  mutate(year = case_when(month == 0 ~ year - 1, TRUE ~ year), # adjust year to previous year if previous month is 0 (i.e. 12)
         month = case_when(month == 0 ~ 12, TRUE ~ month))) # adjust month to 12 if previous month is 0 (i.e. 12)

# A tibble: 4 x 3
  fbd        month  year
  <date>     <dbl> <dbl>
1 2019-01-02    12  2018
2 2019-02-01     1  2019
3 2019-03-01     2  2019
4 2019-04-01     3  2019

left_join(data_org, data_fbd)
Joining, by = c("month", "year")
# A tibble: 4 x 4
  org        month  year fbd       
  <date>     <dbl> <dbl> <date>    
1 2018-12-21    12  2018 2019-01-02
2 2019-01-01     1  2019 2019-02-01
3 2019-01-31     1  2019 2019-02-01
4 2019-02-15     2  2019 2019-03-01
0 голосов
/ 27 февраля 2019

Вот подход: сначала добавьте число month к рабочим датам.Затем для любой из дат, которые вы хотите найти, сначала добавьте один месяц к дате (используя %m+% months(1) от lubridate, чтобы избежать опрокидывания, и используйте месяц этой даты , чтобы выполнить объединение. Вотвоспроизводимый пример (только с использованием нескольких дат из вопроса).

library(tidyverse)
library(lubridate)

df_close_day <- data.frame(
  month = c("January", "Feburary", "March", "April"),
  first_biz_day = ymd(c("2019-01-02", "2019-02-01", "2019-03-01", "2019-04-01"))
)

# Add the month so that we can join this later
df_close_day <- df_close_day %>%
  mutate(
    month_of_first_biz_day = month(first_biz_day)
  )

df_dates_to_lookup <- data.frame(
  orig_date = ymd(c("2018-12-21", "2019-01-01", "2019-01-31", "2019-02-15"))
)

df_dates_to_lookup %>%
  mutate(
    next_month = orig_date %m+% months(1),
    month_of_next = month(next_month)
  ) %>%
  left_join(
    df_close_day, by = c("month_of_next" = "month_of_first_biz_day")
  )
#>    orig_date next_month month_of_next    month first_biz_day
#> 1 2018-12-21 2019-01-21             1  January    2019-01-02
#> 2 2019-01-01 2019-02-01             2 Feburary    2019-02-01
#> 3 2019-01-31 2019-02-28             2 Feburary    2019-02-01
#> 4 2019-02-15 2019-03-15             3    March    2019-03-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...