Создавать даты на основе столбца даты - тот же день недели, тот же месяц - PullRequest
0 голосов
/ 05 августа 2020

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

indexdt
01-02-2019
08-15-2019

Мне нужно сгенерировать даты, чтобы получать даты в один и тот же день недели, тот же месяц и тот же год, то есть 2019. Мне также нужно создать даты с тем же условием для 2020.

Финальный стол на 2019 год:

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

Финальный стол на 2020 год: (поскольку 01-02-2019 выпадает на среду, выбираются все даты среды с 2020 года. 15.08.2019 выпадает на четверг, выбраны все даты четверга с 2020 года

indexdt     date
01-02-2019  01-08-2020
01-02-2019  01-15-2020
01-02-2019  01-22-2020
01-02-2019  01-29-2020
08-15-2019  08-06-2020
08-15-2019  08-13-2020
08-15-2019  08-20-2020
08-15-2019  08-27-2020

Ищу решение data.table.

1 Ответ

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

Мы можем преобразовать 'indexdt' в Date класс, l oop по элементам, получить seq значение дат с концом, указанным как конец месяца с помощью ceiling_date (от lubridate) и укажите by как «неделя» в list, а затем unnest в столбце list

library(dplyr)
library(purrr)
library(lubridate)
library(tidyr)
df1 %>%
   mutate(indexdt = as.Date(indexdt, "%m-%d-%Y"),
     date = map(indexdt, ~ seq(.x, ceiling_date(.x, 'month'),
           by = 'week')[-1])) %>%
   unnest(c(date))

Или используя data.table

library(data.table)    
setDT(df1)[, indexdt := as.Date(indexdt, "%m-%d-%Y")]
df1[, .(date = seq(indexdt, ceiling_date(indexdt, "month"),
         by = "week")[-1]), .(indexdt)]

Для 2020 добавьте один год

df1 %>%
   mutate(indexdt = as.Date(indexdt, "%m-%d-%Y"), 
    date = map(indexdt, ~ seq(.x + years(1), 
       ceiling_date(.x + years(1), 'month'), by = 'week')[-1])) %>% 
   unnest(c(date))

с data.table

df1[, .(date = seq(indexdt, ceiling_date(indexdt +years(1), "month"), 
      by = "week")[-1]), .(indexdt)]

данными

df1 <- structure(list(indexdt = c("01-02-2019", "08-15-2019")), class = "data.frame", row.names = c(NA, 
-2L))
...