首页 > 解决方案 > 根据索引日期之前和之后的条件生成日期

问题描述

我有一个包含 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

标签: rdplyrdata.tablelubridate

解决方案


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

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

推荐阅读