【问题标题】:Continue dates on a data frame in r在 r 中的数据框中继续日期
【发布时间】:2018-08-13 10:22:05
【问题描述】:

假设我有以下data.frame

Dates<-seq(as.Date('2017/01/01'), by = 'day', length.out = 365)
A <- data.frame(date=(Dates), month=month(Dates), week=week(Dates))
library(dplyr)
B <- A %>% dplyr::mutate(day = lubridate::wday(date, label = TRUE))
B[350:365,]

          date month week day
350 2017-12-16    12   50 Sat
351 2017-12-17    12   51 Sun
352 2017-12-18    12   51 Mon
353 2017-12-19    12   51 Tue
354 2017-12-20    12   51 Wed
355 2017-12-21    12   51 Thu
356 2017-12-22    12   51 Fri
357 2017-12-23    12   51 Sat
358 2017-12-24    12   52 Sun
359 2017-12-25    12   52 Mon
360 2017-12-26    12   52 Tue
361 2017-12-27    12   52 Wed
362 2017-12-28    12   52 Thu
363 2017-12-29    12   52 Fri
364 2017-12-30    12   52 Sat
365 2017-12-31    12   53 Sun

我需要在结束日期之后再添加十个日期,即从 2018-01-01 到 2018-01-10。一周的顺序应该是连续的。例如:

           date month week day
 365 2017-12-31    12   53 Sun
 366 2018-01-01     1   53 Mon
 367 2018-01-02     1   53 Tue
 368 2018-01-03     1   53 Wed
 369 2018-01-04     1   53 Thu
 370 2018-01-05     1   53 Fri
 371 2018-01-06     1   53 Sat
 372 2018-01-07     1   54 Sun
 373 2018-01-08     1   54 Mon
 374 2018-01-09     1   54 Tue
 375 2018-01-10     1   54 Wed

【问题讨论】:

    标签: r date dataframe


    【解决方案1】:
    library(dplyr)
    library(lubridate)
    
    Dates<-seq(as.Date('2017/01/01'), by = 'day', length.out = 365)
    A <- data.frame(date=(Dates), month=month(Dates), week=week(Dates))
    
    B <- A %>% dplyr::mutate(day = lubridate::wday(date, label = TRUE))
    B[350:365,]
    
    
    B %>%
      rbind(                                                                    # bind rows with the following dataset     
        data.frame(date = seq(max(B$date)+1, by = 'day', length.out = 10)) %>%  # create sequence of new dates
          mutate(month = month(date),                                           # add month
                 day = wday(date, label = TRUE),                                # add day
                 week = cumsum(day=="Sun") + max(A$week)) ) %>%                 # add week: continuous from last week of A and gets updated every Sunday
      tbl_df()                                                                  # only for visualisation purposes
    
    
    # # A tibble: 375 x 4
    #   date       month  week day  
    #   <date>     <dbl> <dbl> <ord>
    # 1 2017-01-01     1     1 Sun  
    # 2 2017-01-02     1     1 Mon  
    # 3 2017-01-03     1     1 Tue  
    # 4 2017-01-04     1     1 Wed  
    # 5 2017-01-05     1     1 Thu  
    # 6 2017-01-06     1     1 Fri  
    # 7 2017-01-07     1     1 Sat  
    # 8 2017-01-08     1     2 Sun  
    # 9 2017-01-09     1     2 Mon  
    #10 2017-01-10     1     2 Tue  
    # # ... with 365 more rows
    

    【讨论】:

    • 谢谢。我已经提取了输出。实际上,我需要一周是连续的。我将编辑我的问题。
    • 再次检查。我已经更改了 week 创建额外日期的逻辑。它现在应该可以工作了。
    • 在运行我的示例或在完整数据集中运行时是否出现错误?
    • 在我的数据集中@AntoniosK
    【解决方案2】:

    对@antoniosk 代码的小调整,只是从过去的数据框中添加了最大周数,并根据需要获得了连续的周数。

    library(dplyr)
    library(lubridate)
    
    Dates<-seq(as.Date('2017/01/01'), by = 'day', length.out = 365)
    A <- data.frame(date=(Dates), month=month(Dates), week=week(Dates))
    
    B <- A %>% dplyr::mutate(day = lubridate::wday(date, label = TRUE))
    B[350:365,]
    
    
    c<- B %>%   rbind(                                                                       # bind rows with the following dataset
    data.frame(date = seq(max(B$date)+1, by = 'day', length.out = 10)) %>% # get 10 extra sequential dates after the last date in B
    mutate(month = month(date), week = (as.numeric(strftime(date, format = "%U")) +max(A$week)),day = wday(date, label = TRUE)) ) %>% tbl_df()       
    

    【讨论】:

    • 再次检查您的输出 :) 它只有 1 行为 week = 53 并且您的周数增加到 55
    • @AntoniosK 第 53 周在 2017 年 12 月 31 日星期日结束,所以星期一是第 54 周。我认为 Gizmo 可以判断这是否是他想要的?
    • 根据他在第 54 周以上发布的内容,应该从周日开始。星期列似乎在星期天发生了变化(检查他上面问题的最后一部分)。
    • 应该像@AntoniosK 所说的那样。我需要每周日改变一周
    • @gizmo 请检查更新后的代码,我已经进行了一些必要的更改,现在连续几周即将到来
    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多