R语言如何将年月周编码日期转换为距最早日期的周序号
R实现年月周自定义编码转连续周序号
你可以按以下步骤处理编码,直接生成可用于散点图X轴的连续周序号:
- 首先拆分
date列的编码结构:7位数字前4位为年份、中间2位为月份、最后1位为当月周次 - 定位排序后最早的日期作为基准,对应序号为1
- 按编码规则计算每个日期和基准日的周间隔,最终序号=1+间隔周数
实现代码
# 构造示例数据 df<-data.frame(date=c(2012034,2012044,2012051,2012063,2012074), math=c(100,100,23,46,78)) # 拆分日期编码为年、月、月内周次三个字段 df$year <- floor(df$date / 1000) df$month <- floor( (df$date %% 1000) / 10 ) df$week_in_month <- df$date %% 10 # 定位最早的基准日期 base_row <- which.min(df$year * 1000 + df$month * 10 + df$week_in_month) y0 <- df$year[base_row] m0 <- df$month[base_row] w0 <- df$week_in_month[base_row] # 计算连续周序号 df$week_index <- 1 + (df$year - y0)*52 + # 跨年偏移,按每年52周计算 (5 - w0) + # 基准月从基准周之后剩余的周数 (df$month - m0 -1)*4 + # 间隔完整月份的周数,每月按4周计算 df$week_in_month # 修正基准月内的序号计算 base_month_mask <- df$year == y0 & df$month == m0 df$week_index[base_month_mask] <- 1 + (df$week_in_month[base_month_mask] - w0)
运行代码后得到的week_index列就是需要的连续序号,对应示例数据的结果为:
- 2012034(2012年3月第4周):1
- 2012044(2012年4月第4周):6
- 2012051(2012年5月第1周):7
- 2012063(2012年6月第3周):13
- 2012074(2012年7月第4周):17
完全匹配给出的间隔计算规则。
绘图适配
如果需要保留原始日期作为X轴标签,可以在绘图时自定义轴内容,避免显示数字编码导致的顺序异常:
plot(df$week_index, df$math, xaxt = "n", # 关闭默认X轴 xlab = "日期", ylab = "数学成绩", pch = 16) # 添加自定义X轴标签 axis(1, at = df$week_index, labels = paste0(df$month, "月第", df$week_in_month, "周"))
注意:如果实际数据中每月周数规则和示例不一致(比如部分小月只有4周、不存在第5周),可以对应调整代码中每月周数、基准月剩余周数的计算参数即可。
内容的提问来源于stack exchange,提问作者이규진
相关产品推荐
相关产品推荐

