Pandas to_datetime()函数周数转换不一致问题求助
问题原因:strftime格式符与ISO周定义的差异
这不是Pandas的问题,是你使用的%W格式符和isocalendar()遵循的ISO周标准定义不同导致的。
核心差异点:
%W的规则(源自strftime标准):- 以周一作为一周的起始日
- 新年中第一个周一之前的所有日期都属于第0周,第一个周一开始才是第1周
- ISO周标准(
isocalendar()采用的规则):- 同样以周一作为一周起始日
- 第1周必须包含当年的第一个周四(即该周至少有4天在当年),新年开始到第一个周四前的日期可能属于上一年的最后一周
结合你的例子分析:
2019年1月1日是周二,按照%W规则:
- 1月1日-1月6日属于第0周
- 1月7日(当年第一个周一)才是
%W第1周的开始
而ISO周标准中,2019年的第1周是2018年12月31日-2019年1月6日(因为包含2019年1月3日这个周四),所以%W的周数比ISO周数整体少1。
你用pd.to_datetime("2019311", format="%Y%W%w")得到的是%W规则下的第31周周一,对应ISO标准的第32周周一(2019-08-05),这和你期望的ISO第31周周一(2019-07-29)自然不一致。
解决办法:
如果你想基于ISO周数获取对应周一的日期,不要用%W,可以通过以下方式实现:
- 构造ISO周的字符串(格式为
%G%V%u,其中%G是ISO年,%V是ISO周数,%u是周一为1的星期几)pd.to_datetime("2019311", format="%G%V%u") # 输出 Timestamp('2019-07-29 00:00:00') - 对于DataFrame中的Year和Week列,可以拼接后用上述格式解析:
df['iso_week_str'] = df['Year'].astype(str) + df['week number of the year'].astype(str).str.zfill(2) + '1' df['monday_date'] = pd.to_datetime(df['iso_week_str'], format="%G%V%u")
内容的提问来源于stack exchange,提问作者NosH
相关产品推荐
相关产品推荐

