Pandas时间格式转换报错:time data '0'不匹配格式,为何需coerce?
日期转换ValueError问题分析与解决
问题背景
在将DataFrame日期列转换为datetime类型时,触发错误:ValueError: time data '0' does not match format '%d.%m.%Y %H:%M' (match)(或对应%d.%m.%Y格式的同类错误)。
测试DataFrame片段如下:
Date DateCP Time kWh DT 0 01.11.2022 01.11.2022 01:00 0.693 01.11.2022 01:00 1 01.11.2022 01.11.2022 02:00 0.675 01.11.2022 02:00 2 01.11.2022 01.11.2022 03:00 1.044 01.11.2022 03:00
已执行转码处理避免字符编码问题:
df['DateCP'] = df['DateCP'].apply(unidecode) df['DT'] = df['DT'].apply(unidecode)
但执行以下转换代码均触发错误:
df['DateCP'] = pd.to_datetime(df['DateCP'], format='%d.%m.%Y') # 或 df['DT'] = pd.to_datetime(df['DT'], format='%d.%m.%Y %H:%M') # 或 df['Date'] = df['Date'].apply(lambda x:datetime.strptime(x,'%d.%m.%Y'))
仅添加errors='coerce'参数后,才能完成转换并得到预期结果:
Date DateCP Time kWh DT 0 01.11.2022 2022-11-01 01:00 0.693 2022-11-01 01:00:00 1 01.11.2022 2022-11-01 02:00 0.675 2022-11-01 02:00:00 2 01.11.2022 2022-11-01 03:00 1.044 2022-11-01 03:00:00
原因解析
核心问题是你的DataFrame中存在隐藏的无效值(如字符串'0'),只是你展示的测试数据片段未包含这些行。
- 当指定
format参数时,pd.to_datetime和datetime.strptime会严格校验每一行数据的格式,只要有一行值不匹配指定格式,就会立即抛出ValueError终止转换。 errors='coerce'参数的作用是:将所有格式不匹配的无效值强制转换为NaT(Not a Time),跳过错误继续完成有效数据的转换,因此能得到你看到的预期结果。
验证与排查方法
你可以通过以下代码定位无效值:
# 筛选DateCP列中不符合'%d.%m.%Y'格式的行 invalid_datecp = df[~df['DateCP'].str.match(r'\d{2}\.\d{2}\.\d{4}')] print("DateCP列无效值行:\n", invalid_datecp) # 筛选DT列中不符合'%d.%m.%Y %H:%M'格式的行 invalid_dt = df[~df['DT'].str.match(r'\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}')] print("DT列无效值行:\n", invalid_dt)
这些代码会输出所有格式不匹配的行,你就能找到导致错误的'0'或其他异常值。
内容的提问来源于stack exchange,提问作者JanisE
相关产品推荐
相关产品推荐

