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

为何pd.to_datetime与pd.Timestamp.fromisocalendar输出结果不一致?

pandas中pd.to_datetime与fromisocalendar周日期解析不一致的问题

问题场景

我期望通过两种方式都得到Timestamp('2025-04-25 00:00:00'):

  • pd.to_datetime('2025175', format='%Y%W%w')
  • pd.Timestamp.fromisocalendar(2025, 17, 5)

但实际第一种方法得到的是一周后的周五Timestamp('2025-05-02 00:00:00'),与第二种结果不符。

最小复现代码

import pandas as pd

friday_datetime = pd.to_datetime('2025175', format='%Y%W%w')
friday_timestamp = pd.Timestamp.fromisocalendar(2025, 17, 5)
assert friday_datetime == friday_timestamp, (friday_datetime, friday_timestamp)

报错信息

AssertionError: (Timestamp('2025-05-02 00:00:00'), Timestamp('2025-04-25 00:00:00'))

问题原因

核心是周数与星期几的格式定义标准不一致:

  • %W是Python strftime的格式规则:以周一为每周起始,一年中的第N个星期,第一个星期从当年的第一个周一开始计算。
  • fromisocalendar遵循ISO 8601标准:以周一为每周起始,第一个星期必须包含当年的第4天(即至少4天在当年),星期几取值为1(周一)到7(周日)。

两种规则对2025年的周数划分产生了偏移,导致解析出的日期差了一周。

解决方案

要让pd.to_datetime的解析结果与fromisocalendar对齐,需要使用ISO标准对应的格式符:

  • %G:对应ISO年份(与%V周数匹配)
  • %V:ISO周数
  • %u:ISO星期几(1=周一,7=周日)

修改后的验证代码:

import pandas as pd

friday_datetime = pd.to_datetime('2025175', format='%G%V%u')
friday_timestamp = pd.Timestamp.fromisocalendar(2025, 17, 5)
assert friday_datetime == friday_timestamp, (friday_datetime, friday_timestamp)

此时断言会通过,两种方式均返回Timestamp('2025-04-25 00:00:00')。

注意:%w的取值是0(周日)到6(周六),%u是1(周一)到7(周日)。本次输入的最后一位是5(对应周五),刚好两者数值一致,无需修改输入字符串;若涉及周日,需要将%w的0转换为%u的7。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:19:56