如何使用Pandas高效解析两种格式的日期字符串?
多格式日期解析的有效方法
问题原因分析
- 多列处理报错:直接对多列调用
pd.to_datetime并指定format时,pandas会默认将每一列视为日期的组成部分(如年、月、日字段),而非独立的日期字符串,因此抛出缺少日期组件的错误。 - 单列处理报错:出现
unconverted data remains: 21说明部分字符串既不匹配%m/%d/%Y也不匹配%m/%d/%y格式,可能存在其他格式或冗余字符。
高效解决方案
1. 单列处理(推荐)
从pandas 1.3.0版本开始,pd.to_datetime支持传入格式列表,会依次尝试解析,无需手动分两次调用:
df["field1"] = pd.to_datetime(df["field1"], format=["%m/%d/%Y", "%m/%d/%y"], errors="coerce")
format=["%m/%d/%Y", "%m/%d/%y"]:指定所有可能的日期格式,pandas会按顺序尝试匹配errors="coerce":将无法解析的字符串转为NaT(缺失日期值)
如果数据量较小,也可以让pandas自动推断格式(效率略低,但代码更简洁):
df["field1"] = pd.to_datetime(df["field1"], errors="coerce")
2. 多列处理
需要对每一列单独解析,可通过apply或循环实现:
方法一:使用apply批量处理
df[["field1", "field2"]] = df[["field1", "field2"]].apply( lambda col: pd.to_datetime(col, format=["%m/%d/%Y", "%m/%d/%y"], errors="coerce") )
方法二:循环遍历列
for col_name in ["field1", "field2"]: df[col_name] = pd.to_datetime(df[col_name], format=["%m/%d/%Y", "%m/%d/%y"], errors="coerce")
额外提示
如果仍有无法解析的字符串,建议先查看这些异常值的格式:
# 筛选无法解析的行(以field1为例) invalid_dates = df[pd.to_datetime(df["field1"], format=["%m/%d/%Y", "%m/%d/%y"], errors="coerce").isna()] print(invalid_dates["field1"].unique())
针对性调整格式列表或清理数据。
内容的提问来源于stack exchange,提问作者briba
相关产品推荐
相关产品推荐

