【问题标题】:Generate dates based on a date column -same day of week, same month根据日期列生成日期 - 一周中的同一天,同一个月
【发布时间】:2020-08-05 16:05:31
【问题描述】:

我有一个包含 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 年之后的所有星期三日期。同样,由于 08-15-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 解决方案。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以将 'indexdt' 转换为 Date 类,循环遍历元素,使用 ceiling_date(来自 lubridate)获取日期的 sequence 并指定为月底在list 中将by 指定为“周”,然后在list 列中指定unnest

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

    【讨论】:

    • 谢谢阿克伦。你在data.table中也有解决方案吗?
    • @Pam 是的,我愿意。我可以在其中使用 lubridate 函数吗?
    • 非常感谢阿克伦!在 data.table 中,您将如何处理 2020 年?我试过 df1[, .(date = seq(indexdt, ceiling_date(indexed +year(1), "month"), by = "week")[-1]), .(indexed)] 但这给了我一个错误-错误:不兼容的类: +
    • @Pam 只需将as.IDate 更改为as.Date。更新
    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多