如何使用python-dateutil的rrule生成仅偶数周的时间实例
使用python-dateutil的rrule生成仅偶数周的时间实例
你推测的没错,byweekno参数确实可以实现仅生成偶数周的时间需求,核心思路是直接指定要包含的偶数周数,完全不受dtstart所在周的影响。下面分两种常见的周定义场景给出具体实现:
场景1:基于ISO标准周(周一为一周起始)
ISO周的规则是:每周从周一开始,第1周是包含当年第一个周四的那周,周数范围为1-53(部分年份有53周)。直接用byweekno筛选偶数周即可:
from dateutil.rrule import rrule, WEEKLY, MO from datetime import datetime # 定义时间范围 start_dt = datetime(2023, 1, 1) end_dt = datetime(2023, 12, 31) # 生成每个偶数ISO周的周一(可替换为其他星期几,比如SU代表周日) even_iso_week_dates = list(rrule( WEEKLY, dtstart=start_dt, until=end_dt, byweekno=[wk for wk in range(1, 54) if wk % 2 == 0], # 筛选所有偶数周数 byweekday=MO # 指定每周的具体星期几,MO=周一 ))
场景2:基于本地自定义周(比如周日为一周起始)
如果你的业务场景用的是本地定义的周(例如美国常用周日作为一周开始,1月1日所在周为第1周),可以先计算每个日期对应的本地周数,再过滤偶数周:
from dateutil.rrule import rrule, WEEKLY, SU from datetime import datetime def get_local_weeknum(dt): # 把星期调整为周日=0,周一=1...周六=6 first_day = datetime(dt.year, 1, 1) adjusted_first_weekday = (first_day.weekday() + 1) % 7 days_since_first = (dt - first_day).days # 计算本地周数 return (days_since_first + adjusted_first_weekday) // 7 + 1 # 生成时间范围内的每周日,再过滤偶数本地周 start_dt = datetime(2023, 1, 1) end_dt = datetime(2023, 12, 31) all_weekly_dates = list(rrule(WEEKLY, dtstart=start_dt, until=end_dt, byweekday=SU)) even_local_week_dates = [dt for dt in all_weekly_dates if get_local_weeknum(dt) % 2 == 0]
注意事项
byweekno的周数范围要覆盖1-53,因为部分年份会有53周,用range(1, 54)可以兼容所有情况- 可以直接用
dateutil.rrule提供的星期常量(MO/TU/WE等)替代数字,代码可读性更高 - 如果不需要限制结束时间,去掉
until参数,改用count指定要生成的时间实例数量
内容的提问来源于stack exchange,提问作者tompi
相关产品推荐
相关产品推荐

