【问题标题】:How can I group days into weeks?如何将天分组为几周?
【发布时间】:2011-11-06 22:14:43
【问题描述】:

在 R 中,如何将日期(天)向量与周数关联?

编辑:“周”应该是日期范围内的周索引,而不是一年内。我为模棱两可表示歉意。

【问题讨论】:

  • 看看lubridate 包,它使处理dates 变得非常容易。例如week(x) 将返回日期 x 的周数。
  • -1 重新编辑 - 所以如果你不知道,我们怎么可能知道你的个人周指数是多少 i) 早点告诉我们,并且 ii) 显示 你的数据还是它的 sn-p 它?
  • @GavinSimpson-你是对的。我应该更清楚。

标签: r date


【解决方案1】:

对于每个日期,通过format() 使用%U%W 格式占位符对其进行格式化,获取它所属的一年中的星期几。 %U 将星期日视为一周的第一天,而 %W 将星期一视为一周的第一天。这是一个例子:

now <- as.Date(Sys.time())
dates <- seq(now, now + 25, by = "1 day") 

dat <- data.frame(Dates = dates, Week = format(dates, format = "%W"))
head(dat, 10)

这给出了:

> head(dat, 10)
        Dates Week
1  2011-11-06   44
2  2011-11-07   45
3  2011-11-08   45
4  2011-11-09   45
5  2011-11-10   45
6  2011-11-11   45
7  2011-11-12   45
8  2011-11-13   45
9  2011-11-14   46
10 2011-11-15   46

虽然从您的问题中不清楚您到底想做什么,但匹配这个日期向量的方法(好吧,我上面的数据框dat)是通过merge()。假设我们有一个要匹配的周向量以及数据框weekdat 中的一些相关数据:

weekdat <- data.frame(Week = 44:50, Price = c(10, 20, 25, 30, 20, 15, 10))

然后我们可以使用merge()datweekdat 链接起来:

> merge(dat, weekdat)
   Week      Dates Price
1    44 2011-11-06    10
2    45 2011-11-07    20
3    45 2011-11-08    20
4    45 2011-11-09    20
5    45 2011-11-10    20
6    45 2011-11-11    20
7    45 2011-11-12    20
8    45 2011-11-13    20
9    46 2011-11-14    25
10   46 2011-11-15    25
11   46 2011-11-16    25
12   46 2011-11-17    25
13   46 2011-11-18    25
14   46 2011-11-19    25
15   46 2011-11-20    25
16   47 2011-11-21    30
17   47 2011-11-22    30
18   47 2011-11-23    30
19   47 2011-11-24    30
20   47 2011-11-25    30
21   47 2011-11-26    30
22   47 2011-11-27    30
23   48 2011-11-28    20
24   48 2011-11-29    20
25   48 2011-11-30    20
26   48 2011-12-01    20

还有其他方法可以将日期匹配或链接到周,但以上内容应该可以为您提供一些工作依据。

【讨论】:

    【解决方案2】:

    您是否只需要自第一个记录以来完成的 7 天间隔数?

    dvec <- as.Date("2001-04-01")+0:90
    dweek <- as.numeric(dvec-dvec[1]) %/% 7
    dweek[1:21]
    # [1] 0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2
    

    【讨论】:

    • @GavinSimpson:我也“+()-ed”了你的,因为这是你的努力提供了推论的基础。 (当我输入“@Gavin”时,我现在会弹出一个“Gavin Simpson”。整洁。)
    • 你必须喜欢整数除法函数%/% - 如果可以的话,我会再给一个 +1 - 答案真的非常简洁。
    • 这也适用于日期时间(POSIXct)对象,但它以秒为单位,所以你需要使用%/% (7*24*60*60)
    • 嗯...所以对于日期向量,这比 Gavin 的方法快大约 30 倍。 Gavin 的方法对 POSIXlt 的效果相对较好(仅慢了 7 倍)。对于 POSIXct 向量,这种方法只是稍微慢了一点,但是,Gavin 的方法慢了 690 倍。不确定是否有任何其他日期时间存储机制。很遗憾,因为 Gavin 的方法更有用 - 它返回一年中的一周,而不是自开始日期以来的一周..
    • 您可以计算一次起始周,然后添加到这个结果中。
    【解决方案3】:

    strftime 是你的朋友...

    ? strftime # to see the help and the format
    
    set.seed(1)
    dates <- Sys.Date() + sample(1:365, size = 10)
    
    R> dates
     [1] "2012-02-11" "2012-03-21" "2012-06-01" "2012-09-30"
     [5] "2012-01-18" "2012-09-25" "2012-10-11" "2012-06-30"
     [9] "2012-06-18" "2011-11-28"
    
    # %j for julian day - number of the day since the 1st of january each year
    
    R> strftime(dates, format = "%j") # or format(dates, format = "%j")
     [1] "042" "081" "153" "274" "018" "269" "285" "182" "170" "332"
    
    R> strftime(dates, format = "%w")
     [1] "6" "3" "5" "0" "3" "2" "4" "6" "1" "1"
    
    # my locale is in French so...
    R> strftime(dates, format = "%A")
     [1] "samedi"   "mercredi" "vendredi" "dimanche" "mercredi"
     [6] "mardi"    "jeudi"    "samedi"   "lundi"    "lundi" 
    

    顺便问一下,您所说的日、月中的日、周或年是什么意思?

    【讨论】:

      猜你喜欢
      • 2019-12-12
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多