You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:23:17