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

如何解决Python中多格式时间字符串的剩余时间计算问题

解决Python中多格式时间字符串转Timedelta并计算剩余时间的问题

我需要计算总时间扣除子时间列表后的剩余时间,但遇到两个核心问题:

  • 时间字符串格式不统一:总时间是分:秒.毫秒格式,子时间可能是分:秒.毫秒或秒.毫秒格式,都是非标准datetime格式,转换时容易报错
  • 扣除后时间格式混乱:用datetime转换后得到的timedelta输出格式不符合预期

之前尝试的代码如下:

from datetime import datetime, timedelta

def convert_to_timedelta(time_string):
    try:
        return datetime.strptime(time_string, '%H:%M:%S.%f') - datetime(1900, 1, 1)
    except ValueError:
        return datetime.strptime(time_string, '%M:%S.%f') - datetime(1900, 1, 1)
    except:
        return timedelta(seconds=float(time_string))

def calculate_remaining_time(total_time, sub_times):
    total_time = convert_to_timedelta(total_time)
    for sub_time in sub_times:
        total_time -= convert_to_timedelta(sub_time)
    return total_time

优化后的实现

原有代码存在格式匹配不精准、异常捕获宽泛、输出格式不符合需求的问题,以下是针对性优化的代码:

from datetime import timedelta

def parse_time_str(time_str):
    # 处理分:秒.毫秒格式,比如 "12:34.567"
    if ':' in time_str:
        mins_secs = time_str.split(':')
        minutes = int(mins_secs[0])
        # 拆分秒和毫秒部分
        sec_part = mins_secs[1].split('.')
        seconds = int(sec_part[0])
        # 补全毫秒到6位微秒,不足补0
        microseconds = int(sec_part[1].ljust(6, '0')) if len(sec_part) > 1 else 0
        return timedelta(minutes=minutes, seconds=seconds, microseconds=microseconds)
    # 处理秒.毫秒格式或纯秒数字符串,比如 "34.567" 或 "12"
    else:
        if '.' in time_str:
            sec_msec = time_str.split('.')
            seconds = int(sec_msec[0])
            microseconds = int(sec_msec[1].ljust(6, '0'))
            return timedelta(seconds=seconds, microseconds=microseconds)
        else:
            return timedelta(seconds=float(time_str))

def format_timedelta(td):
    # 将timedelta转换回 分:秒.毫秒 格式的字符串
    total_seconds = td.total_seconds()
    minutes = int(total_seconds // 60)
    remaining_seconds = total_seconds % 60
    seconds = int(remaining_seconds)
    milliseconds = int((remaining_seconds - seconds) * 1000)
    return f"{minutes}:{seconds:02d}.{milliseconds:03d}"

def calculate_remaining_time(total_time_str, sub_time_strs):
    total = parse_time_str(total_time_str)
    for sub_str in sub_time_strs:
        sub = parse_time_str(sub_str)
        total -= sub
        # 可选:防止剩余时间为负数,根据业务需求调整
        if total < timedelta(0):
            raise ValueError("剩余时间不能为负数")
    return format_timedelta(total)

代码优势说明

  • 精准解析多格式:通过判断字符串中的:和.直接拆分时间分量,避免datetime格式匹配的局限性
  • 格式统一输出:新增format_timedelta函数,将计算后的timedelta转换回用户需要的分:秒.毫秒格式
  • 错误可控:去掉宽泛的异常捕获,改用结构化解析逻辑,同时增加剩余时间负数判断,避免逻辑错误

使用示例

total = "5:30.123"
sub_times = ["1:20.456", "30.789", "0:45.0"]
remaining = calculate_remaining_time(total, sub_times)
print(remaining)  # 输出: 3:13.878

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:36:12