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

如何在Pandas中处理SRT时间戳比较及字幕行合并?

解决方案:SRT格式字幕时长计算与短字幕合并

1. 解决SRT时间戳转换报错问题

pd.to_datetime无法直接处理逗号分隔毫秒的SRT格式(00:00:00,230),无需强行转Timestamp,直接将时间转为毫秒数即可完成时长计算,同时保留原SRT格式:

def srt_to_ms(srt_time):
    # 拆分时分秒与毫秒部分
    hhmmss, ms = srt_time.split(',')
    h, m, s = map(int, hhmmss.split(':'))
    # 计算总毫秒数
    return h * 3600000 + m * 60000 + s * 1000 + int(ms)

# 给DataFrame添加毫秒计算列
df['start_ms'] = df['Start_Time'].apply(srt_to_ms)
df['end_ms'] = df['End_Time'].apply(srt_to_ms)

2. 短字幕合并逻辑实现

通过循环检查每一行的时长(end_ms - start_ms),若不足5000毫秒(5秒)则合并下一行内容,更新当前行的End_Time并删除下一行,循环直到所有行时长达标:

i = 0
while i < len(df) - 1:
    duration = df.loc[i, 'end_ms'] - df.loc[i, 'start_ms']
    if duration < 5000:
        # 合并当前行与下一行的文本(空格拼接)
        df.loc[i, 'Text'] = f"{df.loc[i, 'Text']} {df.loc[i+1, 'Text']}"
        # 用下一行的End_Time替换当前行
        df.loc[i, 'End_Time'] = df.loc[i+1, 'End_Time']
        # 更新当前行的毫秒结束值
        df.loc[i, 'end_ms'] = df.loc[i+1, 'end_ms']
        # 删除下一行并重置索引
        df = df.drop(i+1).reset_index(drop=True)
        # 不递增索引,合并后需重新检查当前行时长
    else:
        i += 1

# 可选:删除中间计算用的毫秒列
df = df.drop(['start_ms', 'end_ms'], axis=1)

3. 关键验证与说明

  • 你提到的loc替换End_Time的方法完全可行:df.loc[i, 'End_Time'] = df.loc[i+1, 'End_Time']能精准定位并修改当前行的结束时间,符合需求。
  • 合并文本时直接用字符串拼接即可,若需处理空文本场景,可添加判断(如if df.loc[i+1, 'Text']:)避免多余空格。
  • 使用while循环而非for循环,是因为删除行后索引会变化,while能灵活控制检查逻辑,避免遗漏合并后仍需验证的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:24:26