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

Python含天数的时长字符串转%H:%M:%S:%f格式及ValueError报错解决

问题根因

你使用的 datetime.strptime() 格式规则没有覆盖输入字符串的全量结构。输入字符串包含前置的83 days, 文本段,而你传入的格式串%H:%M:%S.%f仅匹配逗号后的时分秒微秒部分,逐字符匹配阶段就会触发不匹配异常。

注意:不要尝试给格式串加%d days的占位符适配前置文本,strptime的%d占位符对应公历月内的日期(范围1-31),无法解析83这类超出月范围的天数值,会触发新的解析错误。

方案1:仅提取逗号后的时分秒段做格式化

如果不需要把83天折算为小时数,只需要输出原字符串中时分秒部分的%H:%M:%S:%f格式,直接拆分字符串取后半段解析即可:

from datetime import datetime

res_time = '83 days, 17:02:10.401369'
# 按逗号分割取后半段纯时间文本
time_segment = res_time.split(', ', maxsplit=1)[1]
parsed_time = datetime.strptime(time_segment, "%H:%M:%S.%f")
# 替换原格式的微秒分隔符为冒号,匹配目标格式要求
res_formated = parsed_time.strftime("%H:%M:%S:%f")
# 最终输出:'17:02:10:401369'

方案2:折算天数值为总小时,输出全量累计时长格式

如果需要把前置的天数值折算为总时长的一部分(比如83天换算为1992小时,和原有的17小时累加),需要先拆分出天数的数值,手动计算累计小时数后拼接格式:

from datetime import datetime

res_time = '83 days, 17:02:10.401369'
# 拆分天部分和时间部分
days_str, time_str = res_time.split(', ', maxsplit=1)
day_count = int(days_str.split(' ')[0])
# 解析时分秒微秒数值
time_detail = datetime.strptime(time_str, "%H:%M:%S.%f")
total_hour = day_count * 24 + time_detail.hour
# 手动拼接目标格式,避免strftime的%H仅输出两位0填充的局限(累计小时数可能超过99)
res_formated = (
    f"{total_hour}:"
    f"{time_detail.minute:02d}:"
    f"{time_detail.second:02d}:"
    f"{time_detail.microsecond:06d}"
)
# 最终输出:'1992:02:10:401369'

补充说明:上述输入的83 days, 17:02:10.401369本身就是Python timedelta对象的默认字符串输出。如果你的流程中本来持有timedelta实例,完全可以跳过字符串解析环节,直接读取对象属性计算格式化结果,减少不必要的字符串拆分开销:

from datetime import timedelta

# 持有原始timedelta对象时的直接计算逻辑
td = timedelta(days=83, hours=17, minutes=2, seconds=10, microseconds=401369)
total_hour = td.days * 24 + td.seconds // 3600
remain_min = (td.seconds % 3600) // 60
remain_sec = td.seconds % 60
res_formated = f"{total_hour}:{remain_min:02d}:{remain_sec:02d}:{td.microseconds:06d}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 13:36:02