【问题标题】:How to create month-end date series using complete function?如何使用完整功能创建月末日期系列?
【发布时间】:2020-05-29 02:47:55
【问题描述】:

这是我的玩具数据集:

df <- tibble::tribble(
         ~date, ~value,
   "2007-01-31",     25,
   "2007-05-31",     31,
   "2007-12-31",     26
  )

我正在使用以下代码创建月末日期系列。

df %>% 
  mutate(date = as.Date(date)) %>%
  complete(date = seq(as.Date("2007-01-31"), as.Date("2019-12-31"), by="month"))

但是,我没有得到正确的月末日期。

  date       value
   <date>     <dbl>
 1 2007-01-31    25
 2 2007-03-03    NA
 3 2007-03-31    NA
 4 2007-05-01    NA
 5 2007-05-31    31
 6 2007-07-01    NA
 7 2007-07-31    NA
 8 2007-08-31    NA
 9 2007-10-01    NA
10 2007-10-31    NA
11 2007-12-01    NA
12 2007-12-31    26

我在这里缺少什么?我可以使用任何其他包中的其他功能。

【问题讨论】:

    标签: r date tidyr xts zoo


    【解决方案1】:

    不需要complete函数,你可以在base R中做到这一点。

    由于每个月的最后一天不同,我们可以创建一系列每月开始日期并从中减去 1 天。

    seq(as.Date("2007-02-01"), as.Date("2008-01-01"), by="month") - 1
    #[1] "2007-01-31" "2007-02-28" "2007-03-31" "2007-04-30" "2007-05-31" "2007-06-30" 
    #    "2007-07-31" "2007-08-31" "2007-09-30" "2007-10-31" "2007-11-30" "2007-12-31"
    

    在更新的数据框中使用相同的逻辑,我们可以这样做:

    library(dplyr)
    df %>% 
      mutate(date = as.Date(date)) %>%
      tidyr::complete(date = seq(min(date) + 1, max(date) + 1, by="month") - 1)
    
    #    date       value
    #   <date>     <dbl>
    # 1 2007-01-31    25
    # 2 2007-02-28    NA
    # 3 2007-03-31    NA
    # 4 2007-04-30    NA
    # 5 2007-05-31    31
    # 6 2007-06-30    NA
    # 7 2007-07-31    NA
    # 8 2007-08-31    NA
    # 9 2007-09-30    NA
    #10 2007-10-31    NA
    #11 2007-11-30    NA
    #12 2007-12-31    26
    

    【讨论】:

    • 抱歉,只是稍微调整了一下问题。现在如何修复更新后的数据框中的日期系列?
    • 太棒了!谢谢!
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2018-03-23
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2021-07-29
    相关资源
    最近更新 更多