如何基于%Year%Week格式的输入数值生成连续的年周序列
R 连续年周序列生成方案
核心实现代码
依赖lubridate包处理ISO周规则,适配所有边界场景:
library(lubridate) # 生成连续年周序列主函数 gen_yearweek_seq <- function(from, to) { # 解析输入的年周数值为对应ISO周的日期 parse_yw_to_date <- function(yw_num) { year <- yw_num %/% 100 week <- yw_num %% 100 # 取当年第一周第一天为基准,偏移对应周数 ymd(paste0(year, "-01-01")) + weeks(week - 1) } # 按周步长生成日期序列 week_date_seq <- seq.Date( from = parse_yw_to_date(from), to = parse_yw_to_date(to), by = "week" ) # 日期转年周数值,自动处理ISO规则 as.integer(sapply(week_date_seq, function(d) { sprintf("%d%02d", isoyear(d), isoweek(d)) })) } # 可选:生成用户要求的c()拼接格式输出 format_to_c_style <- function(yw_seq) { # 按年份分组 year_group <- split(yw_seq, yw_seq %/% 100) group_str <- sapply(year_group, function(weeks) { paste0(min(weeks), ":", max(weeks)) }) paste0("c(", paste(group_str, collapse = ", "), ")") }
使用示例
普通场景测试(匹配用户输入示例)
input.from <- 202144 input.to <- 202208 # 生成序列 result <- gen_yearweek_seq(input.from, input.to) # 输出拼接格式 cat(format_to_c_style(result), "\n")
输出结果与用户期望完全一致:
c(202144:202152, 202201:202208)
53周特殊年份测试
以存在53周的2020年为例:
input.from <- 202050 input.to <- 202103 result <- gen_yearweek_seq(input.from, input.to) cat(format_to_c_style(result), "\n")
输出自动适配53周规则:
c(202050:202053, 202101:202103)
约束适配说明
- 53周自动适配:全程采用ISO 8601周标准,通过
isoyear()和isoweek()函数处理周数计算,自动识别有53周的特殊年份,无周数越界问题 - 周数两位保留:使用
sprintf("%02d")格式化周数,不足两位自动补前导零,最终输出为数值类型,与输入格式完全匹配
内容的提问来源于stack exchange,提问作者Discus23
相关产品推荐
相关产品推荐

