多格式datetime列转换失败求助:含AM/PM与24小时制时间
解决混合日期格式转换问题
方法1:用Pandas多格式匹配(1.3.0+版本可用)
Pandas 1.3.0之后支持给pd.to_datetime的format参数传入格式列表,直接覆盖两种目标格式:
import pandas as pd # 定义两种待匹配的日期格式 date_formats = [ '%Y-%m-%dT%H:%M:%SZ', # 对应2023-01-25T20:08:38Z格式 '%B %d, %Y, %I:%M %p' # 对应January 25, 2023, 8:08 PM格式 ] # 执行转换,errors='coerce'将无效值转为NaT,方便后续清理 df['column_name'] = pd.to_datetime(df['column_name'], format=date_formats, errors='coerce')
Pandas会自动依次尝试每个格式匹配字符串,成功转换后统一为datetime类型,仅真正无效的日期值会生成NaT。
方法2:低版本Pandas兼容方案
如果你的Pandas版本不支持多格式列表,可分两次转换再合并结果:
# 转换第一种格式,无法匹配的保留NaT df['temp_fmt1'] = pd.to_datetime(df['column_name'], format='%Y-%m-%dT%H:%M:%SZ', errors='coerce') # 转换第二种格式 df['temp_fmt2'] = pd.to_datetime(df['column_name'], format='%B %d, %Y, %I:%M %p', errors='coerce') # 合并两列,优先取第一列的有效值,空缺用第二列补充 df['column_name'] = df['temp_fmt1'].combine_first(df['temp_fmt2']) # 删除临时辅助列 df.drop(['temp_fmt1', 'temp_fmt2'], axis=1, inplace=True)
后续清理操作
转换完成后,可直接执行以下代码删除包含NaT/NA值的列:
df = df.dropna(axis=1, how='any')
若仅需删除目标日期列存在NaT的行,可使用:
df = df.dropna(subset=['column_name'])
格式参数说明
%Y:4位年份,%m:2位月份,%d:2位日期%H:24小时制小时,%I:12小时制小时%M:分钟,%S:秒%B:完整月份名称(如January),%p:AM/PM标识
内容的提问来源于stack exchange,提问作者kiyis_stats
相关产品推荐
相关产品推荐

