pandas调用pd.to_datetime转换日期列报格式不匹配问题咨询
报错原因
你指定的日期格式%m/%d/%Y仅能匹配06/13/1980这类斜杠分隔的「数字月/日/年」结构,和实际存储的June 13, 1980 (United States)字符串结构完全不符:
- 月份部分是完整英文名称(如June),不是两位数数字
- 日期各部分用空格、逗号分隔,不是斜杠
- 日期末尾还带括号包裹的地区无关内容,不属于日期组成部分
因此格式匹配直接失败触发报错。
解决方法
方法1:快速自动解析(适合小数据集、列内日期格式不统一的场景)
pandas 2.0及以上版本支持mixed格式模式,可自动识别常见日期结构,同时自动忽略末尾非日期的冗余内容,代码如下:
df['format_released'] = pd.to_datetime(df['released'], format='mixed', errors='coerce')
参数说明:
errors='coerce':把无法解析的异常值统一转为NaT(时间类型空值),不会中断整体转换流程,后续可单独筛选异常值排查
方法2:预处理+指定精确格式(适合大数据集、追求转换效率的场景)
先把字符串末尾括号包裹的无关内容切除,再按照有效日期的实际结构指定格式转换,转换速度比自动推断高10~100倍,适合百万行以上的数据集:
# 1. 用正则删除括号及内部的所有内容,再去掉首尾多余空格 df['temp_date'] = df['released'].str.replace(r'\(.*\)', '', regex=True).str.strip() # 2. 按有效日期结构指定格式:%B对应完整英文月份名,%d对应两位日期,%Y对应四位年份 df['format_released'] = pd.to_datetime(df['temp_date'], format='%B %d, %Y', errors='coerce') # 3. 删除临时列 df.drop(columns='temp_date', inplace=True)
常用日期格式符参考
避免后续再写错格式匹配规则:
%m:两位数字月份(01-12)%b:英文月份缩写(Jan、Jun等)%B:完整英文月份名(January、June等)%d:两位数字日期(01-31)%Y:四位数字年份(1980、2024等)%y:两位数字年份(80代表1980、24代表2024)
内容的提问来源于stack exchange,提问作者user17957342
相关产品推荐
相关产品推荐

