Python实现YYYYW格式年份周数的周数减法计算
解决YYYYW格式周数减去指定周数的问题
我来帮你搞定这个需求!你已经成功把YYYYW格式的字符串转成了datetime对象,接下来只需要两步:用timedelta减去指定周数,再把新的日期转回YYYYW格式就行。
完整代码示例
from datetime import datetime, timedelta def subtract_weeks_from_yyyww(yyyww_str, weeks_to_subtract): # 解析输入的YYYYW字符串 year = yyyww_str[:4] week = yyyww_str[-2:] # 用周一作为该周的基准日(和你原来的逻辑一致) date_str = f"{year} {week} 1" date = datetime.strptime(date_str, "%Y %W %w") # 减去指定周数 new_date = date - timedelta(weeks=weeks_to_subtract) # 将新日期转回YYYYW格式 # 用%G获取ISO年份,%V获取ISO周数,避免跨年份的问题 # %V会自动返回两位数的周数,补零对齐格式 new_yyyww = new_date.strftime("%G%V") return new_yyyww # 测试你的例子:201642减去43周 result = subtract_weeks_from_yyyww("201642", 43) print(result) # 输出:201552
关键细节说明
- 跨年份适配:如果减去周数后日期落到上一年的末尾周(比如1月初的日期属于上一年的第52/53周),用
%G能获取到周对应的ISO年份,而不是自然年,这样能保证周数和年份完全匹配,避免出现201653这类不符合逻辑的格式。 - 基准日逻辑:你原来选择周一作为周的基准日,这和
%W的定义(周一为一周起始)完全匹配,所以转换逻辑是准确的。如果你的业务里周起始是周日,只需要把基准日改成'0',格式符换成%U即可。 - 格式对齐:
%V会自动返回两位数的周数(比如第5周显示为05),完美契合YYYYW的格式要求。
结果验证
拿你的测试案例来说,201642对应的是2016年第42周的周一(2016-10-17),减去43周后得到2015-12-21,这一天正好属于2015年的第52周,输出201552完全符合预期。
内容的提问来源于stack exchange,提问作者user6083088
相关产品推荐
相关产品推荐

