如何在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
相关产品推荐
相关产品推荐

