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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:02:37