【问题标题】:Grouping dates into weeks using cut and breaks使用剪切和中断将日期分组为周
【发布时间】:2022-01-03 15:13:22
【问题描述】:

我有一些看起来像这样的数据:

#   order_date quantity
# 1 2021-01-01       54
# 2 2021-01-01       32
# 3 2021-01-02       42
# 4 2021-01-01      132
# 5 2021-01-01       56
# 6 2021-01-02       88
# 7 2021-01-08       99
# 8 2021-01-10       54

当我使用以下代码时:

df$week <- cut(as.Date(df$order_date), breaks="week")

我得到以下信息:

#   order_date quantity       week
# 1 2021-01-01       54 2020-12-28
# 2 2021-01-01       32 2020-12-28
# 3 2021-01-02       42 2020-12-28
# 4 2021-01-01      132 2020-12-28
# 5 2021-01-01       56 2020-12-28
# 6 2021-01-02       88 2020-12-28
# 7 2021-01-08       99 2021-01-04
# 8 2021-01-10       54 2021-01-04

由于我的数据从 21 年 1 月 1 日开始,我希望周分组从 21 年 1 月 1 日开始,而不是 2020 年 12 月 28 日(最近的星期日)。所以我的小组看起来像这样:

#   order_date quantity       week
# 1 2021-01-01       54 2021-01-01
# 2 2021-01-01       32 2021-01-01
# 3 2021-01-02       42 2021-01-01
# 4 2021-01-01      132 2021-01-01
# 5 2021-01-01       56 2021-01-01
# 6 2021-01-02       88 2021-01-01
# 7 2021-01-08       99 2021-01-07
# 8 2021-01-10       54 2021-01-07

对其他库/语法开放。

【问题讨论】:

    标签: r date cut


    【解决方案1】:

    您可以在日期范围加上一周后使用seq.Dat。不需要任何软件包。

    dat |> 
      transform(week=cut(order_date,
                         breaks=seq.Date(min(order_date), max(order_date) + 7, 
                                         by='week')))
    #    order_date quantity       week
    # 1  2021-01-01       54 2021-01-01
    # 2  2021-01-01       32 2021-01-01
    # 3  2021-01-01       42 2021-01-01
    # 4  2021-01-01      132 2021-01-01
    # 5  2021-01-01       56 2021-01-01
    # 6  2021-01-02       88 2021-01-01
    # 7  2021-01-03       99 2021-01-01
    # 8  2021-01-03       54 2021-01-01
    # 9  2021-01-08       23 2021-01-08
    # 10 2021-01-10       11 2021-01-08
    

    注意:使用 R >= 4.1。


    数据:

    dat <- structure(list(order_date = structure(c(18628, 18628, 18628, 
    18628, 18628, 18629, 18630, 18630, 18635, 18637), class = "Date"), 
        quantity = c(54, 32, 42, 132, 56, 88, 99, 54, 23, 11)), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

      【解决方案2】:

      您可以使用lubridate::floor_date 手动设置一周的第一天。

      dat$Week <- lubridate::floor_date(dat$order_date, "weeks", week_start = 5)
      
      > dat
      #   order_date quantity       week
      #1  2021-01-01       54 2021-01-01
      #2  2021-01-01       32 2021-01-01
      #3  2021-01-01       42 2021-01-01
      #4  2021-01-01      132 2021-01-01
      #5  2021-01-01       56 2021-01-01
      #6  2021-01-02       88 2021-01-01
      #7  2021-01-03       99 2021-01-01
      #8  2021-01-03       54 2021-01-01
      #9  2021-01-02       23 2021-01-01
      #10 2021-01-10       11 2021-01-08
      

      数据

      order_date <- c("2021-01-01", "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-02","2021-01-03","2021-01-03","2021-01-02","2021-01-10")
      quantity <- c(54,32,42,132,56,88,99,54,23,11)
      dat <- data.frame(order_date=as.Date(order_date), quantity)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-15
        • 2021-03-07
        • 2012-09-06
        • 2018-08-07
        • 1970-01-01
        相关资源
        最近更新 更多