【问题标题】:Can we extract week numbers from the date我们可以从日期中提取周数吗
【发布时间】:2019-10-08 18:05:17
【问题描述】:

我得到了一个数据框 df。有没有办法填充周数(如数据框中的第二列所示)。我的意思是周数应该是连续的。例如。

df <- structure(list(Date = structure(c(1527120000, 1527206400, 1527292800, 
1527379200, 1527465600, 1527552000, 1527638400, 1527724800, 1527811200, 
1527897600, 1527984000, 1528070400, 1528156800, 1528243200, 1528329600, 
1528416000, 1528502400, 1528588800, 1528675200, 1528761600, 1528848000, 
1528934400, 1529020800, 1529107200, 1529193600, 1529280000, 1529366400, 
1529452800, 1529539200, 1529625600, 1529712000, 1529798400, 1529884800, 
1529971200, 1530057600, 1530144000), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Week = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 
5, 5, 5, 6)), row.names = c(NA, -36L), class = c("tbl_df", "tbl", 
"data.frame"))

这里的第一个日期是24-05-2018,因此它应该编号为 1。该数字应在接下来的 6 天内继续,然后 2 应在接下来的 7 天内开始。 4周后,数字不应再为1,数字应编号为5,依此类推。所以基本上我需要检查 4 年时间序列列表的平均值。所以从第一天(比如 2000 年)到最后一天(比如 2014 年),应该填充周数。有什么办法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用gl

    library(dplyr)
    df %>% 
       mutate(Week = as.integer(gl(n(), 7, n())))
    

    【讨论】:

    • 谢谢。我知道这个答案:)。但是周数从 1 开始(您可以参考我的数据框(第 2 列))。我知道实际的 weeknum 是 21,但我的意图不是那样。它应该从 1 开始。应该是 (1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3 ,3 等等).....
    • 但是我没有得到as.integer(gl(n(), 7, n())))这个代码
    • @DevP 是在每 7 行创建一个分组索引,即对于前 7 行,它将是 1,然后是 2,等等。直到结束..
    【解决方案2】:

    日期值基本上是自特定日期以来的秒数。在这里,我们可以用一些模数学计算周偏移量

    df %>% 
      mutate(NewWeek = as.numeric(Date-min(Date)) %/% (60*60*24*7) + 1)
    

    我们减去第一个日期,然后看看已经过去了多少个 7 天。

    【讨论】:

    • 使用模运算的优雅解决方案
    【解决方案3】:

    你可以使用lubridate:

    library(lubridate)
    df$Data <- trunc((ymd(df$Date) - min(ymd(df$Date)))/dweeks(1)) + 1
    

    1 需要从 1 开始周数。trunc 去掉小数位。

    【讨论】:

      【解决方案4】:

      你也可以试试:

      df %>%
       mutate(Week = ceiling(row_number()/7))
      
         Date                 Week
         <dttm>              <dbl>
       1 2018-05-24 00:00:00     1
       2 2018-05-25 00:00:00     1
       3 2018-05-26 00:00:00     1
       4 2018-05-27 00:00:00     1
       5 2018-05-28 00:00:00     1
       6 2018-05-29 00:00:00     1
       7 2018-05-30 00:00:00     1
       8 2018-05-31 00:00:00     2
       9 2018-06-01 00:00:00     2
      10 2018-06-02 00:00:00     2
      

      它不考虑日期,它只是每 7 行组合在一起。

      同base R:

      ceiling(1:NROW(df)/7)
      
       [1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 6
      

      【讨论】:

        猜你喜欢
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-25
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多