лучший способ добавить непредсказуемые строки времени в python3? - PullRequest
0 голосов
/ 08 октября 2019

проект, который я создаю, занимает разные промежутки времени из списков треков альбомов в виде строк, и я хочу добавить их кумулятивно. Входные данные могут различаться по непредсказуемости, например, следующий список строк времени ввода:

inputs = ['0:32', '3:19', '11:22']

Так что я хотел бы добавить все эти времена, например, так:

0: 32 + 3: 19 + 11:22 = = 15: 13

Мне нужно убедиться, что полученное время является действительной временной меткой, поэтому реально необходимо увеличить секунду / минуту / часы

Я поняллучший способ сделать это - преобразовать каждую строковую единицу в объект datetime Python, но у меня возникают трудности с размышлениями о том, как сделать это реалистично, поскольку все мои знания и примеры, которые я могу найти для преобразования строки в дату и время, используют трудноШаблоны даты и времени, например:

datetime_str = '09/19/18 13:55:26'
datetime_object = datetime.strptime(datetime_str, '%m/%d/%y %H:%M:%S')

Мне нужно определить несколько различных возможных значений времени строки, например:

0:32  = %m:%S
23:19 = %M:%S
01:22:23 = %H:%M:%S
01:2:23 = %H:%m:%S

, есть ли способ автоматизировать этот процесс добавлениянесколько разных временных меток? Мой мыслительный процесс состоял в том, чтобы взять временную строку, преобразовать в datetime, преобразовать этот datetimeObject в секунды, сложить их, а затем преобразовать обратно в формат dateTime HH: MM: SS. Но я зацикливаюсь на том, сколько разных временных входов я могу получить. Любой совет очень ценится, как я могу решить эту проблему

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Если вы знаете, что все они следуют этому формату, можно выполнить анализ вручную:

def add_times(inputs):
    total_secs=0
    for input in inputs:
        chunks = map(int, reversed(input.split(':')))
        total_secs += sum(chunk*60**i for i,chunk in enumerate(chunks))

    return "{}:{}:{}".format(total_secs//3600, (total_secs%3600)//60, total_secs%60)


print(add_times( ['0:32', '3:19', '11:22']))

дает мне 0:15:13.

1 голос
/ 08 октября 2019

Для продолжительности , пожалуйста, работайте с datetime.timedelta. Вот как разбить ваши строки на timedelta, показанные шаг за шагом:

>>> '5:13'.split(':')
['5', '13']
>>> list(map(int, '5:13'.split(':')))
[5, 13]
>>> list(zip(('seconds', 'minutes', 'hours'), map(int, reversed('5:13'.split(':')))))
[('seconds', 13), ('minutes', 5)]
>>> dict(zip(('seconds', 'minutes', 'hours'), map(int, reversed('5:13'.split(':')))))
{'seconds': 13, 'minutes': 5}
>>> timedelta(**dict(zip(('seconds', 'minutes', 'hours'), map(int, reversed('5:13'.split(':'))))))
datetime.timedelta(seconds=313)

Затем сложите ваши timedeltas:

from datetime import timedelta
from functools import reduce
from operator import add

def to_timedelta(duration: str) -> timedelta:
    return timedelta(**dict(zip(('seconds', 'minutes', 'hours'), map(int, reversed(duration.split(':'))))))

inputs = ['0:32', '3:19', '11:22']
print(reduce(add, map(to_timedelta, inputs)))
# 0:15:13

A timedelta автоматически форматирует в хорошемФормат "H: M: S" при преобразовании в строку, так что вам не нужно больше ничего делать.

...