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

pandas获取指定日期到今日的年份周数组合及跨年周问题修复

Pandas ISO周历跨年周统计修复方案

问题描述

需要使用pandas获取指定起始日期到当日的所有年份+周数组合列表,原有实现存在跨年周统计异常:针对日期2019-12-31,使用pandas的dt.year和dt.week属性返回结果为年=2019、周=1,不符合ISO周历规则,该日期实际归属ISO年=2020、ISO周=1。

原有问题代码

import datetime
from datetime import date
import pandas as pd
base = datetime.date.today()
d1=date(2019,1,1)
delta=base-d1

monday1 = (base - datetime.timedelta(days=base.weekday()))
monday2 = (d1 - datetime.timedelta(days=d1.weekday()))
number_of_weeks_between = int((monday1 - monday2).days / 7)

date_list = [base - datetime.timedelta(days=x*7) for x in range(number_of_weeks_between+1)]
date_list = pd.DataFrame(date_list, columns =['Date'])
date_list['Date'] = date_list['Date'].astype('datetime64[ns]')
date_list['YEAR'] = date_list['Date'].dt.year
date_list['WEEK'] = date_list['Date'].dt.week

修复逻辑

pandas原生dt.year取的是日期对应的公历年,和ISO周数没有绑定,导致跨年周归属错误。直接使用Python datetime对象自带的isocalendar()方法即可获取正确的ISO年、ISO周数,该方法返回的三元组第一位为ISO年,第二位为ISO周数,天然适配跨年周场景。

修复后可运行代码

import datetime
from datetime import date
import pandas as pd
base = datetime.date.today()
d1=date(2019,1,1)
delta=base-d1

monday1 = (base - datetime.timedelta(days=base.weekday()))
monday2 = (d1 - datetime.timedelta(days=d1.weekday()))
number_of_weeks_between = int((monday1 - monday2).days / 7)

date_list = [base - datetime.timedelta(days=x*7) for x in range(number_of_weeks_between+1)]
# 注:原分享的修复代码中month_list为变量名笔误,实际存储的是ISO周数,已调整为week_list更符合语义
year_list = [x.isocalendar()[0] for x in date_list]
week_list = [x.isocalendar()[1] for x in date_list]
date_list = pd.DataFrame(
          {'Date': date_list,
           'YEAR': year_list,
           'WEEK': week_list
                         })
date_list['Date'] = date_list['Date'].astype('datetime64[ns]')

内容的提问来源于stack exchange,提问作者Cowboy_Owl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:30:02