如何标准化Pandas DataFrame混合格式日期列?解决转换报错
问题分析与解决方案
问题原因
- 整数转换报错:原代码直接将float类型转为int时,遇到
NaN(数据中隐含的缺失值)会抛出ValueError,因为NaN无法转换为整数。 - 无分隔符日期解析错误:
pd.to_datetime默认将纯数字字符串(如"20110912")解析为时间戳(秒数),而非日期格式,因此得到1970年的错误结果。
修正后的代码
import numpy as np import pandas as pd df = pd.DataFrame({'date':[20110912.0, 20230102, '10/10/17', '4/8/14', '7/28/2020', '20121001', '2023.01.02', '2019-04-23 0:00:00', '2011-12-21 0:00:00', '07/28/14', '', 'NaN' ]}) # 统一转为字符串,将空值和"NaN"替换为实际缺失值 df['date'] = df['date'].astype(str).replace({'': np.nan, 'NaN': np.nan}) # 自定义函数处理不同格式的日期 def parse_date(date_str): if pd.isna(date_str): return np.nan # 匹配8位无分隔符数字日期(如20110912),强制按年月日格式解析 if date_str.isdigit() and len(date_str) == 8: return pd.to_datetime(date_str, format='%Y%m%d') # 自动匹配其他带分隔符的日期格式,无法解析的转为缺失值 return pd.to_datetime(date_str, errors='coerce') # 应用解析函数,如需保留datetime类型可去掉.dt.date df['date'] = df['date'].apply(parse_date).dt.date print(df)
关键说明
- 空值预处理:先将所有值转为字符串,把空字符串和"NaN"替换为
np.nan,从根源避免转换异常。 - 无分隔符日期强制解析:通过判断字符串长度和是否为纯数字,指定
format='%Y%m%d',确保8位数字被正确识别为年月日。 - 容错机制:使用
errors='coerce'将无法解析的格式转为NaT(缺失的datetime值),保证代码稳定运行。
内容的提问来源于stack exchange,提问作者user21407177
相关产品推荐
相关产品推荐

