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
相关产品推荐
相关产品推荐

