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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:18:15