R语言as.Date()使用%W周计数格式时的异常行为问题咨询
核心问题原因
R的as.Date()底层调用strptime解析日期时,%W格式符存在容易被忽略的隐含规则:%W定义的周虽然以周一为起始,但解析时如果指定星期为周日(%u=7或%w=0),会被默认判定为对应周的上一周的周日,而非当前周的最后一天,这就导致你输入2016年第1周的周日时,返回了上一周(2015年最后一周)的周日2016-01-03。
另外你提到的英国周计数本质是ISO 8601周规则,%W和ISO周规则还有一个差异:如果年初第一周不足7天,%W会将这部分日期计入第0周,而ISO周不存在第0周,会将这部分日期计入上一年的最后一周。
可行解决方案
方案1(最稳妥,全版本兼容)
先解析获取对应周的周一,再向后偏移6天得到周日,完全避开格式符的隐藏逻辑:
# 获取对应周的周一 mon <- as.Date("2016011", format = "%Y%W%u") # 加6天得到同一周的周日 sun <- mon + 6
运行结果:
- mon:
2016-01-04 - sun:
2016-01-10,完全符合预期
如果输入的周数超出当年最大周数,as.Date()会直接返回NA,也符合你的需求。
方案2(使用ISO周格式符,R4.0及以上版本支持)
如果要直接通过年周+星期的字符串解析,需要使用ISO周对应的配套格式符,不要混用公历年格式符%Y和普通周格式符%W:
%G:ISO周对应的年份,和ISO周数%V配套使用%V:ISO 8601周数,即你需要的英国周计数规则,周数范围1-53,没有第0周%u:星期表示,1代表周一,7代表周日
示例代码:
# 获取2016年第1周的周一 as.Date("2016011", format = "%G%V%u") # 获取2016年第1周的周日 as.Date("2016017", format = "%G%V%u")
运行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者xb5wz
相关产品推荐
相关产品推荐

