Генерация дат на основе условий до и после дат индекса - PullRequest
0 голосов
/ 04 августа 2020

У меня есть фрейм данных с 10 000+ датами. например,

indexdt
01-02-2019
08-15-2019

Мне нужно создать два фрейма данных на основе следующих условий:

  1. генерировать даты, чтобы я получал тот же день недели, до 3 недель до и после даты индекса. Выход должен быть
Table 1

    indexdt dates
    01-02-2019  12-26-2018
    01-02-2019  12-19-2018
    01-02-2019  12-12-2018
    01-02-2019  01-09-2019
    01-02-2019  01-16-2019
    01-02-2019  01-23-2019
    08-15-2019  07-25-2019
    08-15-2019  08-01-2019
    08-15-2019  08-08-2019
    08-15-2019  08-22-2019
    08-15-2019  08-29-2019
    08-15-2019  08-05-2019
тот же день недели, тот же месяц. Результат должен быть
Table 2

    indexdt     date
    01-02-2019  01-09-2019
    01-02-2019  01-16-2019
    01-02-2019  01-23-2019
    01-02-2019  01-30-2019
    08-15-2019  08-01-2019
    08-15-2019  08-08-2019
    08-15-2019  08-22-2019
    08-15-2019  08-29-2019

1 Ответ

1 голос
/ 04 августа 2020

Я ответил на оба вопроса здесь, но вы должны задать только один вопрос в одном сообщении:

library(dplyr)
library(purrr)
library(lubridate)

#Convert to date
df <- df %>% mutate(indexdt = mdy(indexdt))
  1. генерировать даты, чтобы я получал один и тот же день недели, до 3 недель до и после индексная дата

Мы используем seq для генерации дат до и после отдельно. [-1] используется для игнорирования даты indexdt, поскольку мы не хотим, чтобы это было в окончательном выводе.

df %>%
  mutate(dates = map(indexdt, ~c(seq(.x, length.out = 4, by = -7)[-1], 
                                 seq(.x, length.out = 4, by = 7)[-1]))) %>%
  unnest(dates)


#   indexdt    dates     
#   <date>     <date>    
# 1 2019-01-02 2018-12-26
# 2 2019-01-02 2018-12-19
# 3 2019-01-02 2018-12-12
# 4 2019-01-02 2019-01-09
# 5 2019-01-02 2019-01-16
# 6 2019-01-02 2019-01-23
# 7 2019-08-15 2019-08-08
# 8 2019-08-15 2019-08-01
# 9 2019-08-15 2019-07-25
#10 2019-08-15 2019-08-22
#11 2019-08-15 2019-08-29
#12 2019-08-15 2019-09-05
тот же день недели, тот же месяц.

Здесь мы создаем последовательность от indexdt даты до начала месяца (floor_date) и другую последовательность от indexdt до конца месяц (ceiling_date - 1).

df %>%
  mutate(dates = map(indexdt, ~c(seq(.x, floor_date(.x, 'month'), by = -7)[-1],
                        seq(.x, ceiling_date(.x, 'month') - 1, by = 7)[-1]))) %>%
  unnest(dates)

#  indexdt    dates     
#  <date>     <date>    
#1 2019-01-02 2019-01-09
#2 2019-01-02 2019-01-16
#3 2019-01-02 2019-01-23
#4 2019-01-02 2019-01-30
#5 2019-08-15 2019-08-08
#6 2019-08-15 2019-08-01
#7 2019-08-15 2019-08-22
#8 2019-08-15 2019-08-29

данные

df <- structure(list(indexdt = c("01-02-2019", "08-15-2019")), 
class = "data.frame", row.names = c(NA, -2L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...