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

将非标准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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:02:57