如何处理Pandas DataFrame混合格式日期,将仅年份转为年初日期
将混合格式日期列统一转换为YYYY-MM-DD格式
你的问题出在指定了固定的%d-%b-%Y格式,导致纯年份的行无法匹配,生成了NaT。可以通过以下两种方法解决:
方法一:利用Pandas自动格式识别(简洁高效)
Pandas的pd.to_datetime默认支持自动识别多种日期格式,包括纯年份(会自动解析为当年1月1日),直接去掉format参数即可:
# 转换为datetime类型 df['date'] = pd.to_datetime(df['date']) # 如果需要转为YYYY-MM-DD格式的字符串(保持datetime类型可跳过此步) df['date'] = df['date'].dt.strftime('%Y-%m-%d')
处理后你的数据会变成:
0 2022-10-22 1 2019-12-03 2 2022-06-27 3 2023-01-01 4 2017-07-15 5 2019-01-01 6 2022-09-07 7 2021-01-01 8 2022-09-30 9 2021-08-17
方法二:分情况手动处理(兼容性更强)
如果自动识别出现异常,可以分两类数据分别处理:
# 先尝试按dd-Mon-yyyy格式转换,不匹配的保留原字符串 df['date'] = pd.to_datetime(df['date'], format='%d-%b-%Y', errors='ignore') # 筛选出仍为纯数字字符串的行,按年份格式转换 year_mask = df['date'].apply(lambda x: isinstance(x, str) and x.isdigit()) df.loc[year_mask, 'date'] = pd.to_datetime(df.loc[year_mask, 'date'], format='%Y') # 格式化为目标字符串格式 df['date'] = df['date'].dt.strftime('%Y-%m-%d')
关键说明
- 不要指定固定
format参数,否则Pandas会严格匹配格式,不满足的行就会生成NaT; - 纯年份被
pd.to_datetime解析后默认就是当年的1月1日,无需额外处理; - 如果需要保持
datetime类型而非字符串,去掉最后一步dt.strftime即可。
内容的提问来源于stack exchange,提问作者FreddicMatters
相关产品推荐
相关产品推荐

