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
相关产品推荐
相关产品推荐

