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本身就是Pythontimedelta对象的默认字符串输出。如果你的流程中本来持有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
相关产品推荐
相关产品推荐

