Сортировка CSV-реплик по таймкоду через Python: как сравнивать время в секундах
Хронологический порядок CSV с метками MM:SS и HH:MM:SS. Числовой ключ sorted, проверка формата и сохранение порядка одинаковых таймкодов.
Убедитесь, что время сопоставимо
Сортировка полезна для таблицы реплик одного аудиофайла, где строки случайно переставили при работе. Для разных интервью одинаковое [00:10] относится к разным источникам. Не объединяйте такие времена в одну хронологию без установленного общего отсчёта.
Сохраните исходную таблицу. Если метки ещё проверяются, начните с правил формата и порядка времени. Сортировка не доказывает правильность временной привязки.
Сравнивайте числа, а не строковое представление
В учебной схеме допустимы 02:15 и 01:02:15 без квадратных скобок. Минуты и секунды двухзначные, от 00 до 59. Первый формат имеет нулевые часы. Для 75:10 или миллисекунд нужны другие правила.
Смешанные строки 01:00:00 и 59:59 лексикографически расположатся не так, как число секунд. Функция seconds возвращает 3600 и 3599, поэтому минутная отметка оказывается раньше часовой. При неподходящем формате код останавливается.
Сохраните новую упорядоченную копию
Положите transcript.csv рядом с sort_time.py, содержащим код ниже. Запустите python sort_time.py или python3 sort_time.py. Предполагаются UTF-8, запятая и колонка timecode. Исходник читается, а новая копия создаётся без перезаписи.
import csv, re
from pathlib import Path
def seconds(value):
value = (value or "").strip()
if not re.fullmatch(r"(?:[0-9]{2}:)?[0-5][0-9]:[0-5][0-9]", value):
raise ValueError(f"Неподходящий таймкод: {value!r}")
parts = list(map(int, value.split(":")))
if len(parts) == 2: parts.insert(0, 0)
h, m, s = parts
return h * 3600 + m * 60 + s
with Path("transcript.csv").open(encoding="utf-8-sig", newline="") as source:
reader = csv.DictReader(source)
headers = reader.fieldnames or []
rows = list(reader)
if "timecode" not in headers or len(headers) != len(set(headers)):
raise ValueError("Проверьте заголовки CSV")
if any(None in row for row in rows): raise ValueError("Лишние поля")
ordered = sorted(rows, key=lambda row: seconds(row["timecode"]))
with Path("transcript-time-sorted.csv").open("x", encoding="utf-8-sig", newline="") as target:
writer = csv.DictWriter(target, fieldnames=headers)
writer.writeheader()
writer.writerows(ordered)
print("Записей сохранено:", len(ordered))
Все исходные колонки сохраняются. sorted создаёт новый список; при равных временных ключах относительный порядок строк не меняется. Но одинаковый таймкод может скрывать разный реальный порядок внутри секунды, который программа не восстанавливает.
Проверьте число строк и соседние реплики
Сверьте количество записей, первый и последний таймкод и несколько переходов говорящих. Если CSV имеет другую структуру, сначала выполните проверку колонок. Для исходной основы используйте расшифровку аудио.
Прослушайте спорный переход: допустимое время способно указывать не ту реплику. Не считайте отсортированный список исправленной диаризацией. Запишите, почему перестановка требовалась и какая копия стала рабочей.
Учебный пример: отметка часа и минуты
Вымышленные строки показывают необходимость числового ключа и стабильного порядка равных значений.
| Метка | Секунд | Порядок |
|---|---|---|
| 59:59 | 3599 | Раньше часа |
| 01:00:00 | 3600 | После 59:59 |
| 01:00:00, вторая строка | 3600 | После первой равной строки |
Если сортировка сильно изменила диалог, остановите дальнейший анализ и проверьте метки по записи. Программа не оценивает связность разговора.
Проверка сортировки времени
Исходный CSV: [версия] Источник аудио: [файл] Отсчёт общий: [подтверждён] Допустимый формат: [схема] Записей до и после: [числа] Равные метки: [проверенные места] Первое и последнее время: [значения] Контроль по аудио: [таймкоды] Новая копия: [имя]
Частые вопросы
Можно сортировать разные интервью вместе?
Только при подтверждённом сопоставимом отсчёте. Иначе разделяйте источники.
Неверный таймкод можно заменить нулём?
Нет. Это создаст ложный порядок. Исправьте метку по источнику.
Равные метки поменяются местами?
Стабильная сортировка сохраняет их относительный порядок из входа.
Сортировка исправляет ошибки распознавания?
Нет. Она меняет порядок строк по заданному ключу.