You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中处理DataFrame多日期格式的更优雅高效方法?

问题描述

正在学习清洗数据集,遇到两种日期时间格式,现有代码可运行但繁琐,希望找到更高效的方法处理DataFrame中的多日期格式,尽量避免使用try/except语句。已知数据时间范围为1963年至2010年,将date_parsed列初始化为'01/01/2023'是安全的。

现有代码:

data['date_parsed'] = pd.to_datetime('01/01/2023', format='%m/%d/%Y')

for i in range(len(data.Date)):
    try:
        data['date_parsed'][i] = pd.to_datetime(data.Date[i], format='%m/%d/%Y')
    except:
        data['date_parsed'][i] = pd.to_datetime(data.Date[i], format='%Y-%m-%dT%H:%M:%S.%fZ')

解决方案

方法1:使用Pandas 2.0+的多格式解析(推荐)

Pandas 2.0及以上版本支持给pd.to_datetime的format参数传入格式列表,内部会依次尝试解析,无需循环和try/except,效率更高:

# 直接解析两种格式,解析失败的会设为NaT
data['date_parsed'] = pd.to_datetime(
    data['Date'],
    format=['%m/%d/%Y', '%Y-%m-%dT%H:%M:%S.%fZ'],
    errors='coerce'
)
# 将解析失败的行替换为指定初始值
data['date_parsed'] = data['date_parsed'].fillna(pd.to_datetime('01/01/2023', format='%m/%d/%Y'))

方法2:分条件批量处理(兼容旧版Pandas)

如果使用低于2.0的Pandas版本,可以通过正则匹配筛选不同格式的行,批量处理:

# 初始化列
data['date_parsed'] = pd.to_datetime('01/01/2023', format='%m/%d/%Y')

# 匹配MM/DD/YYYY格式的行
mask_mdy = data['Date'].str.match(r'^\d{2}/\d{2}/\d{4}$')
data.loc[mask_mdy, 'date_parsed'] = pd.to_datetime(data.loc[mask_mdy, 'Date'], format='%m/%d/%Y')

# 剩下的行即为ISO格式,批量解析
mask_iso = ~mask_mdy
data.loc[mask_iso, 'date_parsed'] = pd.to_datetime(data.loc[mask_iso, 'Date'], format='%Y-%m-%dT%H:%M:%S.%fZ')

方法3:自动推断格式(简单快捷)

如果数据量不大,也可以让Pandas自动推断日期格式,无需手动指定:

data['date_parsed'] = pd.to_datetime(data['Date'], errors='coerce')
# 替换解析失败的值
data['date_parsed'] = data['date_parsed'].fillna(pd.to_datetime('01/01/2023', format='%m/%d/%Y'))

这种方法代码最简洁,但自动推断的效率略低于指定格式,不过对于已知只有两种格式的场景完全适用。


内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:15:45