使用pandas.to_timedelta转换CSV中带小数的时长列时触发ValueError错误的原因及解决方法
问题分析与解决方法
报错原因
pd.to_timedelta() 默认期望的时间格式是 hh:mm:ss[.ffffff](时:分:秒.微秒),而你的数据格式是 mm:ss.s 或 mm:ss.ss(分:秒.毫秒)—— 第一个冒号前面的数字被解析器误判为「小时」,但冒号后面的部分本该是「分钟」,却出现了小数点,不符合它预期的hh:mm:ss结构,因此抛出ValueError。
举个直观的例子:13:08.4会被解析器错误识别为「13小时,08.4分钟」,但它不允许分钟部分带小数点,所以直接报错。
解决方法
这里提供几种实用方案,按操作复杂度和通用性排序:
方案1:补全小时前缀(最简单直接)
给每个时间字符串前面加上00:,把格式转换成00:mm:ss.s,让pd.to_timedelta()能正确识别分和秒的结构:
df['Time'] = pd.to_timedelta('00:' + df['Time'])
测试示例:
import pandas as pd data = {'Time': ['13:08.4', '13:06.20']} df = pd.DataFrame(data) df['Time'] = pd.to_timedelta('00:' + df['Time']) print(df['Time']) # 输出: # 0 0 days 00:13:08.400000 # 1 0 days 00:13:06.200000 # Name: Time, dtype: timedelta64[ns]
方案2:拆分字段计算总秒数(更灵活)
如果你的数据格式可能存在变化(比如偶尔混入带小时的记录),这种方法适配性更强:
def convert_to_timedelta(time_str): # 拆分分钟和秒的部分 mins, secs = time_str.split(':') # 计算总秒数:分钟转秒 + 秒数(支持小数) total_seconds = int(mins)*60 + float(secs) return pd.Timedelta(seconds=total_seconds) df['Time'] = df['Time'].apply(convert_to_timedelta)
方案3:用datetime解析后转换
借助datetime.strptime解析时间字符串,再转换为timedelta类型,适合对时间格式解析规则熟悉的场景:
from datetime import datetime df['Time'] = df['Time'].apply(lambda x: pd.Timedelta(datetime.strptime(x, '%M:%S.%f').time()))
这里的%f会自动匹配秒后面的1位或多位小数,兼容性很好。
内容的提问来源于stack exchange,提问作者Jsevillamol
相关产品推荐
相关产品推荐

