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

