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
相关产品推荐
相关产品推荐

