R 中按月排序会跳过月份

问题描述 投票:0回答:1

在下面的代码中,我试图完成一个日期序列。我的开始日期是 5 月 31 日,结束日期是 8 月 31 日。当我在下面按月份

seq()
时,您会看到 2023 年 6 月被跳过,但 2023 年 7 月出现两次(该月的第一个和最后一个)。我想按月排序,以便每个月都出现在两个日期之间的序列中。我怎样才能实现这个目标?

library(tidyverse)
df1 <- data.frame(id = "1", 
                  startdate = as.Date( "2023-05-31"),
                  enddate = as.Date("2024-08-31")) %>% 
        mutate(date_duration = startdate,
               enddate = ceiling_date(enddate, "month") -1 ) %>%
      complete(date_duration = seq(startdate, enddate, by = "month"))
r tidyr lubridate
1个回答
0
投票

一种选择是使用

lubridate::add_with_rollback
%m+%
,这说明了月份长度不同的事实。来自文档 (
?add_with_rollback
)

Date %m+% Months(n) 始终返回 Date 之后第 n 个月的日期。

为了完成这项工作,我首先计算要添加到

startdate
的月数。

library(tidyverse)

data.frame(
  id = "1",
  startdate = as.Date("2023-05-31"),
  enddate = as.Date("2024-08-31")
) %>%
  mutate(
    date_duration = startdate,
    enddate = ceiling_date(enddate, "month") - 1
  ) %>%
  complete(
    date_duration = add_with_rollback(
      startdate,
      months(
        seq_len(floor((enddate - startdate) / dmonths()))
      )
    )
  ) |>
  arrange(date_duration)
#> # A tibble: 16 × 4
#>    date_duration id    startdate  enddate   
#>    <date>        <chr> <date>     <date>    
#>  1 2023-05-31    1     2023-05-31 2024-08-31
#>  2 2023-06-30    <NA>  NA         NA        
#>  3 2023-07-31    <NA>  NA         NA        
#>  4 2023-08-31    <NA>  NA         NA        
#>  5 2023-09-30    <NA>  NA         NA        
#>  6 2023-10-31    <NA>  NA         NA        
#>  7 2023-11-30    <NA>  NA         NA        
#>  8 2023-12-31    <NA>  NA         NA        
#>  9 2024-01-31    <NA>  NA         NA        
#> 10 2024-02-29    <NA>  NA         NA        
#> 11 2024-03-31    <NA>  NA         NA        
#> 12 2024-04-30    <NA>  NA         NA        
#> 13 2024-05-31    <NA>  NA         NA        
#> 14 2024-06-30    <NA>  NA         NA        
#> 15 2024-07-31    <NA>  NA         NA        
#> 16 2024-08-31    <NA>  NA         NA

使用以下方法可以获得相同的结果:

date_duration = startdate %m+% months(
    seq_len(floor((enddate - startdate) / dmonths()))
)
© www.soinside.com 2019 - 2024. All rights reserved.