将非标准MM:SS.s时间格式转换为HH:MM:SS:sss的技术求助
解决非标准时间格式转换问题
我懂你的困扰——这种绑定采样频率的非规则小数位时间格式,确实没法直接用datetime库直接搞定,因为它的小数位不是常规的毫秒,而是秒内采样点的标记。下面给你一套精准的解决方案:
核心思路
原格式MM:SS.s里的s是0-9的数字,代表当前秒内的采样点序号,我们需要根据对应采样频率,计算这个序号对应的实际毫秒偏移量,再拼接成目标格式HH:MM:SS:sss。
代码实现
这里写了一个通用函数,完美适配20Hz、19Hz、21Hz等任意采样频率:
def convert_custom_time(time_str, sample_rate): # 拆分原时间字符串的各个组成部分 minutes_str, sec_decimal = time_str.split(':') seconds_str, digit_str = sec_decimal.split('.') # 转换为整数类型方便计算 minutes = int(minutes_str) seconds = int(seconds_str) sample_digit = int(digit_str) # 计算总秒数:分钟转秒 + 整秒部分 + 采样点对应的秒偏移量 total_seconds = minutes * 60 + seconds + sample_digit * (1 / sample_rate) # 拆分出小时、分钟、秒、毫秒 hours = int(total_seconds // 3600) remaining_secs = total_seconds % 3600 final_mins = int(remaining_secs // 60) final_secs = remaining_secs % 60 milliseconds = int((final_secs - int(final_secs)) * 1000) final_secs = int(final_secs) # 格式化为目标格式(小时默认用00,如需12小时制可自行调整) return f"{hours:02d}:{final_mins:02d}:{final_secs:02d}:{milliseconds:03d}"
测试示例
用20Hz采样频率处理你的示例数据:
- 输入
"42:49.0"→ 输出"00:42:49:000" - 输入
"42:49.1"→ 输出"00:42:49:050"(因为1/20=0.05秒=50毫秒) - 输入
"42:50.0"→ 输出"00:42:50:000"
如果是19Hz的情况,"42:49.1"会计算为00:42:49:053(1/19≈0.0526秒,取整为53毫秒),完全适配不同采样率的差异。
为什么datetime搞不定?
datetime.strptime里的%S.%f会把42:49.1直接解析为49.1秒(即100毫秒),但你的小数位不是实际的小数秒,而是采样点序号,必须手动根据采样频率计算偏移量,这才是解决问题的核心。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

