Pandas计算日历周年份错误 正确生成YearWeek字段方案
错误原因
核心错误是YearWeek生成时混用了两个不匹配的时间字段:
strftime('%V')取的是ISO标准周数,遵循ISO周的跨年规则- 同语句里的
%y取的是日期所属的自然年,和ISO周对应的年份没有绑定关系
跨年周场景下两者不匹配就会出问题:
- 2023-01-01属于2022年的第52个ISO周,
%y取自然年23,拼出错误值2352 - 2024-12-31属于2025年的第1个ISO周,
%y取自然年24,拼出错误值2401
你自行计算的Year_1逻辑本质是在推算ISO周年份,但没必要手动实现,pandas已经提供了适配ISO规则的官方字段,手动偏移计算容易遗漏边界场景。
修正方案
直接调用isocalendar()返回的官方year字段拼接周数即可,这是pandas内置的ISO周标准实现,不会出现跨年匹配错误。
修正后代码:
import pandas as pd data = {'Date': ['31.12.2022','01.01.2023','02.01.2023','31.12.2023','01.01.2024','02.01.2024','31.12.2024','01.01.2025','02.01.2025']} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date'], format="%d.%m.%Y") # 统一取ISO日历的年、周字段,避免字段不匹配 iso_info = df['Date'].dt.isocalendar() df['Week'] = iso_info['week'] df['ISO_Year'] = iso_info['year'] # 取ISO年最后两位+两位周数拼接标准YearWeek df['YearWeek'] = df['ISO_Year'].astype(str).str[-2:] + df['Week'].astype(str).str.zfill(2) df['Natural_Year'] = df['Date'].dt.year df
运行后得到完全符合预期的结果:
Date Week YearWeek ISO_Year Natural_Year 0 2022-12-31 52 2252 2022 2022 1 2023-01-01 52 2252 2022 2023 2 2023-01-02 1 2301 2023 2023 3 2023-12-31 52 2352 2023 2023 4 2024-01-01 1 2401 2024 2024 5 2024-01-02 1 2401 2024 2024 6 2024-12-31 1 2501 2025 2024 7 2025-01-01 1 2501 2025 2025 8 2025-01-02 1 2501 2025 2025
补充:ISO周规则为每周从周一开始,每年第一个包含周四的周为第1周,年初、年末的日期大概率会出现自然年和ISO周年份不一致的情况,禁止混用自然年字段和ISO周字段拼接周编号。
内容的提问来源于stack exchange,提问作者Glammy
相关产品推荐
相关产品推荐

