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

Pandas时间格式转换报错:strptime存在未转换数据0及lambda优化疑问

问题解决与优化方案

一、报错原因

ValueError: unconverted data remains: 0 说明你的Date/Time列里有长度不是4位的字符串,比如"0"、"123"这类不符合%H%M格式的内容——哪怕你用了strip(),也没法修复本身长度异常的数据。另外要注意:2400不属于合法的小时范围(strptime的%H只认00-23),就算解决了长度问题,这个值也会报错。

二、替代lambda的优雅写法

方法1:直接字符串切片(最快)

不用转datetime,直接给4位字符串插冒号,顺便处理2400的特殊情况:

# 先把所有值补成4位字符串(短的补前导0)
df['Date/Time'] = df['Date/Time'].str.strip().str.zfill(4)
# 用numpy的where替代lambda,批量生成格式
import numpy as np
df['Time_reformatted'] = np.where(
    df['Date/Time'] == '2400',
    '00:00',
    df['Date/Time'].str[:2] + ':' + df['Date/Time'].str[2:]
)

方法2:用pandas内置时间函数(更规范)

借助to_datetime自动处理格式,还能处理异常值:

# 先清洗成4位字符串
df['Date/Time'] = df['Date/Time'].str.strip().str.zfill(4)
# 转成时间格式,无效值转成NaT(空时间)
df['Time_reformatted'] = pd.to_datetime(
    df['Date/Time'],
    format='%H%M',
    errors='coerce'
).dt.strftime('%H:%M')
# 把2400手动改成00:00(按业务需求)
df.loc[df['Date/Time'] == '2400', 'Time_reformatted'] = '00:00'

方法3:先清掉异常数据

如果有大量非4位的无效值,先过滤再处理:

# 只保留长度为4的行
df = df[df['Date/Time'].str.strip().str.len() == 4]
# 直接插冒号
df['Time_reformatted'] = df['Date/Time'].str[:2] + ':' + df['Date/Time'].str[2:]

三、排查小技巧

用df['Date/Time'].str.strip().str.len().value_counts()查看所有字符串的长度分布,一眼就能找到异常数据的位置。

内容的提问来源于stack exchange,提问作者wuethi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:25:31