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

如何处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:15:01