Как сложить отметки времени Python - PullRequest
2 голосов
/ 03 февраля 2020

Я использую ужасную библиотеку datetime и пытаюсь сделать то, что должно быть очень легко. У меня есть коллекция временных меток в моем видеофайле, и я хочу просто вычесть start_time из end_time, а затем взять сумму всех и вывести общее время видеофайла. Мои данные в моем видеофайле выглядят так:

<p begin="00:02:42.400" end="00:02:43.080" style="s2">product_1</p>

Итак, мой код,

start_time = dt.strptime(begin, '%H:%M:%S.%f')
endie_time = dt.strptime(end, '%H:%M:%S.%f')

diff += endie_time-start_time

Я пытаюсь продолжать добавлять 'diff'

Я получаю эту ошибку,

UnboundLocalError: локальная переменная 'diff', на которую ссылается перед присваиванием

Я думаю, что ошибка в том, что diff является объектом datetime, а не целое число. Но потом, когда я делаю `int (diff), ничего не работает.

Как я могу выполнить эту простую задачу? Я ценю любую помощь, которую я могу получить по этой надоедливой проблеме.

Спасибо

Ответы [ 2 ]

4 голосов
/ 03 февраля 2020

Фундаментальная проблема здесь заключается в том, что модуль datetime имеет дело с реальным временем настенных часов, тогда как вы пытаетесь иметь дело с продолжительностью . Следовательно, единственный действительно применимый класс в модуле datetime для решения вашей проблемы - это timedelta, который по существу выражает длительности. Чтобы разобрать ваши строки в timedelta, вам нужно сделать это немного вручную:

>>> from datetime import timedelta
>>> h, m, s = '00:02:43.080'.split(':')
>>> timedelta(hours=int(h), minutes=int(m), seconds=float(s))
datetime.timedelta(seconds=163, microseconds=80000)

Если у вас теперь есть два таких timedelta s, вы можете вычесть их:

>>> end - start
datetime.timedelta(microseconds=680000)

И вы можете добавить их к существующему timedelta:

diff = timedelta()
diff += end - start

Полный пример:

from datetime import timedelta

diff = timedelta()

def parse_ts(ts: str) -> timedelta:
    h, m, s = ts.split(':')
    return timedelta(hours=int(h), minutes=int(m), seconds=float(s))

timestamps = [('00:02:42.400', '00:02:43.080'), ...]

for start, end in timestamps:
    diff += parse_ts(end) - parse_ts(start)

print(diff)
0 голосов
/ 03 февраля 2020

Как говорится в комментариях к исходному вопросу, использование X + = Y требует, чтобы вы уже определили X.

Возможное исправление будет:

import datetime as dt

diff = dt.timedelta(0)  # Initialize the diff with 0

start_time = dt.datetime.strptime(begin, '%H:%M:%S.%f')
endie_time = dt.datetime.strptime(end, '%H:%M:%S.%f')

diff += endie_time-start_time  # Accumulate the time difference in diff 

Так как кажется, что Вы хотите выполнить итерацию по нескольким звездам / датам окончания:

import datetime as dt

diff = dt.timedelta(0)  # Initialize the diff with 0

for begin_i, end_i in zip(begin, end):

    start_time = dt.datetime.strptime(begin_i, '%H:%M:%S.%f')
    endie_time = dt.datetime.strptime(end_i , '%H:%M:%S.%f')

    diff += endie_time-start_time  # Accumulate the time difference in diff 

В обоих вышеупомянутых случаях diff будет иметь тип dt.timedelta.

...