【问题标题】:Generate dates based on condition before and after index dates根据索引日期之前和之后的条件生成日期
【发布时间】:2020-11-24 02:24:14
【问题描述】:

我有一个包含 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
  1. 一周中的同一天,同一个月。输出应该是
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

【问题讨论】:

    标签: r dplyr data.table lubridate


    【解决方案1】:

    我已经回答了这两个问题,但你应该只在一篇文章中问一个问题:

    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
    
    1. 一周中的同一天,同一个月。

    在这里,我们创建了一个从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))
    

    【讨论】:

    • 谢谢罗纳克。我是一个新用户,我不知道我应该在一篇文章中发布一个问题......尽管它是有道理的。感谢您向我指出。
    • 能否在data.table中给出解决方案?谢谢。
    • 如果您需要data.table 的答案,您应该在原帖中提及。您可以为此提出一个新问题。
    • 再次感谢罗纳克。我应该在我的帖子中提到它。我将发布一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多