如何强制pandas Timestamp按DD/MM/YYYY格式解析日期字符串
pandas Timestamp 解析DD/MM/YYYY格式日期不一致问题解决
问题现象
- 系统区域设置为英国格式DD/MM/YYYY,但
pd.Timestamp解析日期字符串时,当日、月数值均不超过12,会默认按MM/DD/YYYY解析,导致星期计算错误:"12/6/2022"预期为2022年6月12日(Sunday),实际被解析为2022年12月6日,返回Tuesday"06/05/2022"预期为2022年5月6日(Friday),实际被解析为2022年6月5日,返回Sunday
- 当日期第一个数值大于12(如
"15/11/2021"),pandas会自动 fallback 到DD/MM/YYYY解析,但会抛出警告提示解析规则不明确 - 按照警告提示传入
infer_datetime_format=True参数时报错,原因是该参数不属于pd.Timestamp构造函数的合法参数
根本原因
pandas 日期解析逻辑默认不跟随操作系统区域设置,无明确格式指定时的默认解析优先级为MM/DD/YYYY,仅当第一个数值超过12(不可能为合法月份)时才会切换解析规则,天然存在歧义;infer_datetime_format是pd.to_datetime()方法的专属参数,不能直接传给pd.Timestamp。
解决方案
单日期解析:显式指定format参数(无歧义、性能最优)
构造pd.Timestamp时直接传入format参数,明确指定日期格式规则,彻底避免解析不一致,同时不会产生警告:
# 2022年6月12日,正确返回Sunday temp = pd.Timestamp("12/6/2022", format="%d/%m/%Y") print(temp.day_name()) # 2022年5月6日,正确返回Friday temp = pd.Timestamp("06/05/2022", format="%d/%m/%Y") print(temp.day_name()) # 2021年11月15日,正确返回Monday,无警告 temp = pd.Timestamp("15/11/2021", format="%d/%m/%Y") print(temp.day_name())
用到的格式符对应规则:
%d:1-2位数字表示的日期(日)%m:1-2位数字表示的月份%Y:4位数字表示的年份
批量日期解析:使用pd.to_datetime
如果需要处理DataFrame/Series中的整列日期字符串,使用pd.to_datetime()方法,同样指定format参数即可,解析效率远高于循环构造单个Timestamp:
import pandas as pd # 示例:处理DataFrame中的日期列 df = pd.DataFrame({ "date_str": ["12/6/2022", "06/05/2022", "15/11/2021"] }) df["parsed_date"] = pd.to_datetime(df["date_str"], format="%d/%m/%Y") df["weekday"] = df["parsed_date"].dt.day_name()
最佳实践
只要处理的日期字符串格式固定,永远显式传入format参数,不要依赖pandas的自动推断逻辑。该写法是pandas官方推荐的日期处理方式,可彻底避免跨版本、跨运行环境的解析歧义,同时解析速度比自动推断快5~10倍。
内容的提问来源于stack exchange,提问作者M C
相关产品推荐
相关产品推荐

