pandas.to_datetime()可批量转换多列日期字符串,errors='coerce'将错误值转为NaT;支持列名列表索引+apply、object列自动识别、带失败统计的日志函数及format/utc等进阶控制。

直接用 pandas.to_datetime() 对多列批量处理,配合 errors='coerce' 可自动把无法解析的值转为 NaT,再结合 apply() 或列选择实现一次性转换。
用 apply + to_datetime 批量转换指定列
适合明确知道哪些列要转、且列名已知的情况。把列名列表传给 df[cols],再用 apply 统一调用 to_datetime:
cols = ['date1', 'date2', 'created_at'] df[cols] = df[cols].apply(pd.to_datetime, errors='coerce')
这样每列都会独立执行转换,错误值(如 '2024-13-01'、'abc')变成 NaT,不报错,也不中断流程。
对所有 object 类型字符串列自动识别并转换
如果数据中混有日期字符串和其他文本列,但你想“尽可能转日期”,可先筛选出疑似日期列(比如列名含 date、time),或直接检查 dtype:
# 找出所有 object 类型且非空的列,尝试转 datetime
date_cols = df.select_dtypes(include=['object']).columns.tolist()
for col in date_cols:
# 粗略判断:前 10 个非空值是否像日期(可选,跳过也行)
sample_vals = df[col].dropna().head(10).astype(str)
if sample_vals.str.match(r'^\d{4}-\d{1,2}-\d{1,2}').any():
df[col] = pd.to_datetime(df[col], errors='coerce')带反馈的健壮转换(推荐用于生产环境)
想知道哪几列成功了、哪几个值失败了?可以封装一个带日志的小函数:
def safe_to_datetime(df, columns, errors='coerce'):
failed_conversions = {}
for col in columns:
original_count = df[col].notna().sum()
converted = pd.to_datetime(df[col], errors=errors)
na_count = converted.isna().sum()
if na_count > 0:
failed_conversions[col] = na_count
df[col] = converted
if failed_conversions:
print("⚠️ 以下列存在无法解析的日期值(已转为 NaT):")
for col, n in failed_conversions.items():
print(f" - {col}: {n} 个值")
return df
使用
df = safe_to_datetime(df, ['order_date', 'ship_date', 'expire_time'])
注意时区和格式(进阶控制)
如果数据有固定格式(如 '%Y/%m/%d %H:%M'),加 format 参数能显著提升性能并减少误判;需要时区可加 utc=True 或 infer_datetime_format=True(仅适用于常见格式):
df['log_time'] = pd.to_datetime(
df['log_time'],
format='%Y-%m-%d %H:%M:%S',
errors='coerce',
utc=True
)不指定 format 时 pandas 会自动推断,较慢且对异常格式更敏感;指定后严格按规则匹配,错误值更可控。










