年度周数显示异常:年初日期被标记为第0周而非第1周
解决日期转年度周数时年初周显示为0的问题
问题原因
你使用的%U格式化符遵循周日作为一周起始的规则,且将包含1月1日的那一周定义为第0周,直到当年第一个周日结束后,下一周才会被标记为第1周。比如2007年1月1日是周一,它所在的周就会被标记为第0周,这导致了不符合预期的结果。
解决方案
方案1:使用ISO标准周数(推荐)
ISO周数以周一为一周起始,且一年的第一周是包含至少4天在当年的周(通常是包含1月4日的周),更符合多数业务场景的周数定义。通过dt.isocalendar().week直接获取:
df['Week'] = df['date'].dt.isocalendar().week
以2007年1月1日(周一)为例,该方法会返回1,符合预期。
方案2:手动调整%U结果
若你需要保留周日作为一周起始的规则,仅修正周数编号,可以将%U转换后的字符串转为整数再加1:
df['Week'] = df['date'].dt.strftime('%U').astype(int) + 1
注意:此调整会让当年第一个周日所在的周变为第2周,需根据业务需求判断是否适用。
方案3:使用ISO周格式化符%V
%V是ISO周数的格式化符,搭配%G可获取周数对应的年份,避免跨年周的年份混淆:
df['ISO_Year'] = df['date'].dt.strftime('%G') df['ISO_Week'] = df['date'].dt.strftime('%V')
比如2006年12月31日(周日)会被标记为2007年的第1周,%G会返回2007,确保周数与年份对应准确。
内容的提问来源于stack exchange,提问作者Tanvir Ahmad Hashmi
相关产品推荐
相关产品推荐

