Pandas将yyyy-MM-ddTHH:mm:ss.SSSZ格式列转为datetime报错排查
解决pd.to_datetime转换含非时间值列的报错问题
你的报错核心原因是last_update_date_time列中存在不符合指定格式的字符串——第0行的token_last_update_date_time,而当你指定format参数时,pandas会严格校验每一行的格式匹配性,只要有一行不匹配就直接抛出ValueError,不会自动转为NaT。
以下是几种可行的解决办法:
强制转换不匹配值为NaT(推荐)
在pd.to_datetime中添加errors='coerce'参数,让不符合格式的字符串自动转为NaT,其他符合格式的正常转换,不会中断流程:df["updatedTimeDateTime"] = pd.to_datetime(df["last_update_date_time"], format='%Y-%m-%dT%H:%M:%S.%fZ', errors='coerce')先筛选有效行再转换
用正则表达式匹配符合目标时间格式的行,仅对这些行执行转换,剩余行手动设为NaT:# 匹配yyyy-MM-ddTHH:mm:ss.SSSZ格式的正则 valid_time_mask = df["last_update_date_time"].str.match(r'^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$') # 初始化新列为NaT df["updatedTimeDateTime"] = pd.NaT # 对有效行执行转换 df.loc[valid_time_mask, "updatedTimeDateTime"] = pd.to_datetime(df.loc[valid_time_mask, "last_update_date_time"], format='%Y-%m-%dT%H:%M:%S.%fZ')移除无效的表头行(若为误混入)
如果第0行的token_last_update_date_time是误导入的表头而非有效数据,可以直接删除该行后再转换:# 删除第0行并重置索引 df = df.drop(index=0).reset_index(drop=True) # 执行转换 df["updatedTimeDateTime"] = pd.to_datetime(df["last_update_date_time"], format='%Y-%m-%dT%H:%M:%S.%fZ')
内容的提问来源于stack exchange,提问作者Mohit Shah
相关产品推荐
相关产品推荐

