聚合连续检测的起止时间以计算总检测时长
合并连续音频检测时间段
问题说明
用算法对音频文件做声音检测后,得到包含检测开始(start)、结束(end)时间的数据集。由于预测每3秒执行一次,需要聚合数据:若第n+1行的start等于第n行的end,则合并这些连续行,得到完整的检测时段及对应时长。
示例数据集
import pandas as pd data = { 'filename': ['file1', 'file1', 'file1', 'file1', 'file1', 'file2', 'file2', 'file2', 'file2', 'file2'], 'start': [21, 24, 27, 44, 60, 34, 37, 55, 58, 120], 'end': [24, 27, 30, 47, 63, 37, 40, 58, 61, 123]} df = pd.DataFrame(data)
期望聚合结果
| filename | start | end | duration |
|---|---|---|---|
| file1 | 21 | 30 | 9 |
| file1 | 44 | 47 | 3 |
| file1 | 60 | 63 | 3 |
| file2 | 34 | 40 | 6 |
| file2 | 55 | 61 | 6 |
| file2 | 120 | 123 | 3 |
实现代码
# 按文件名分组处理,确保每个文件的时间段独立计算 df_grouped = df.groupby('filename', group_keys=False).apply(lambda g: # 生成连续组标识:当前行start与上一行end不相等时,标记为新组 g.assign(group_id=(g['start'] != g['end'].shift()).cumsum()) ).groupby(['filename', 'group_id']).agg( start=('start', 'first'), end=('end', 'last') ).reset_index(drop=True) # 计算每个时段的时长 df_grouped['duration'] = df_grouped['end'] - df_grouped['start'] print(df_grouped)
代码逻辑说明
- 按文件分组:以
filename为分组依据,保证不同音频文件的时间段不会混淆。 - 标记连续时段:通过
g['start'] != g['end'].shift()判断当前行是否与上一行连续,用cumsum()生成递增的组ID,将连续的行归为同一组。 - 聚合计算:按
filename和组ID聚合,取每组的第一个start、最后一个end,再通过end - start计算时段时长。
内容的提问来源于stack exchange,提问作者Benjamin Cretois
相关产品推荐
相关产品推荐

