如何将xts对象按周分组时设置周日为周起始日?
如何将xts对象按周日至周六的周周期分组?
咱们先来理清楚问题:当用split()对xts对象按周分组时,默认的f='weeks'参数是按照周一至周日的周期划分数据的,但如果我们需要改成周日至周六的周周期,就得自定义分组标签,不能直接用内置的周规则啦。
核心思路
为每个日期生成一个所在周的周日日期作为分组标识,这样同一周(周日到周六)的所有日期就会被分到同一个组里。
方法一:用基础R函数实现(无需额外包)
直接基于xts的日期索引计算分组标签,代码如下:
library(xts) # 创建示例xts对象 idx <- as.Date("2018-3-1") + 0:14 v <- 1:15 x <- xts(v, idx) # 计算每个日期所属周的周日(作为分组标签) # as.POSIXlt(idx)$wday 返回0=周日,1=周一...6=周六,用原日期减去wday天得到所在周的周日 week_start_sunday <- idx - as.POSIXlt(idx)$wday # 按周日至周六的周规则分组 group <- split(x, f = week_start_sunday) group
运行后输出结果如下,分组逻辑完全符合周日至周六的要求:
[[1]] [,1] 2018-03-01 1 # 周四 2018-03-02 2 # 周五 2018-03-03 3 # 周六 [[2]] [,1] 2018-03-04 4 # 周日 2018-03-05 5 # 周一 2018-03-06 6 # 周二 2018-03-07 7 # 周三 2018-03-08 8 # 周四 2018-03-09 9 # 周五 2018-03-10 10 # 周六 [[3]] [,1] 2018-03-11 11 # 周日 2018-03-12 12 # 周一 2018-03-13 13 # 周二 2018-03-14 14 # 周三 2018-03-15 15 # 周四
方法二:用lubridate包简化代码(更直观)
如果不介意安装额外包,lubridate的floor_date()函数可以直接指定周的起始日,代码更简洁:
library(xts) library(lubridate) # 创建示例xts对象 idx <- as.Date("2018-3-1") + 0:14 v <- 1:15 x <- xts(v, idx) # 指定周起始为周日(week_start=7代表周日) week_start_sunday <- floor_date(idx, "week", week_start = 7) # 分组 group <- split(x, f = week_start_sunday)
这个方法的效果和第一种完全一致,只是代码可读性更强~
内容的提问来源于stack exchange,提问作者lessthanl0l
相关产品推荐
相关产品推荐

