Pandas to_datetime处理混合日期格式报错及NaT问题求助
处理混合日期格式的Pandas datetime转换问题
问题场景
DataFrame日期列同时存在两种格式:
- 常规格式:
YYYY-MM-DD HH:MM - ISO8601格式:
YYYY-MM-DDTHH:MM:SS±HH:MM(如2022-03-04T23:00:00+01:00)
遇到的问题:
- 直接调用
pd.to_datetime()转换后,调用.dt.time报错:Can only use .dt accessor with datetimelike values - 添加
format='mixed'参数后,所有值变为NaT,单一格式数据也无法正常转换
解决方案
方案1:升级Pandas并直接转换
较新版本的Pandas(>=1.5.0)已支持自动识别这两种混合格式,无需额外参数:
import pandas as pd d = {'Timestamp': ['2022-03-05T23:00:00+01:00', '2022-03-04T20:00:00+01:00', '2024-04-13 13:00']} df = pd.DataFrame(data=d) # 直接转换日期列,errors='coerce'将无法识别的值转为NaT df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='coerce') # 正常提取时分信息,也可访问其他datetime属性(如.dt.date、.dt.hour) print(df['Timestamp'].dt.time)
方案2:分批次转换(兼容旧版Pandas)
如果无法升级Pandas,可分两步处理未转换的格式:
import pandas as pd d = {'Timestamp': ['2022-03-05T23:00:00+01:00', '2022-03-04T20:00:00+01:00', '2024-04-13 13:00']} df = pd.DataFrame(data=d) # 第一步:转换可自动识别的格式,保留无法识别的原始字符串 df['Timestamp'] = pd.to_datetime(df['Timestamp'], errors='ignore') # 第二步:筛选出未转换的object类型值,单独转换 mask = df['Timestamp'].dtype == object df.loc[mask, 'Timestamp'] = pd.to_datetime(df.loc[mask, 'Timestamp'], errors='coerce') # 正常访问datetime属性 print(df['Timestamp'].dt.time)
关于format='mixed'的说明
format='mixed'要求所有日期字符串必须匹配推断出的单一格式,混合多种格式时会导致推断失败,因此所有值转为NaT,不适合当前场景。
内容的提问来源于stack exchange,提问作者croessler
相关产品推荐
相关产品推荐

