Estou escrevendo uma função que precisa de uma entrada timedelta para ser passada como uma string. O usuário deve inserir algo como "32m" ou "2h32m", ou mesmo "4:13" ou "5hr34m56s" ... Existe alguma biblioteca ou algo que já tenha esse tipo de coisa implementado?
96
d
dias,h
horas,m
minutos es
segundos usando uma linha (após a importaçãodatetime
):datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)
.Respostas:
Para o primeiro formato (5hr34m56s), você deve analisar usando expressões regulares
Aqui está a solução baseada em reformulação:
fonte
dateutil.parser.parse
não analisatimedelta
objetos. Ele retorna umdatetime
e acionaria uma exceção para strings como'28:32:11.10'
.Para mim, a solução mais elegante, sem ter que recorrer a bibliotecas externas como dateutil ou analisar manualmente a entrada, é usar o
strptime
método de análise de string poderoso do datetime .Depois disso, você pode usar seu objeto timedelta normalmente, convertê-lo em segundos para ter certeza de que fizemos a coisa certa etc.
fonte
datetime.strptime("32:20:25","%H:%M:%S")
não funciona) e você precisa saber o formato de entrada exato.timedelta
parâmetro muito chato, mas o melhor que posso inventar para evitar isso é:, odelta = t - datetime.combine(t.date(), time.min)
que é ... horrível.Eu tive um pouco de tempo em minhas mãos ontem, então desenvolvi a resposta de @virhilo em um módulo Python, adicionando mais alguns formatos de expressão de tempo, incluindo todos aqueles solicitados por @priestc .
O código-fonte está no github (Licença MIT) para quem quiser. Também está no PyPI:
Retorna o tempo como um número de segundos:
fonte
Eu queria inserir apenas um tempo e depois adicioná-lo a várias datas, então funcionou para mim:
fonte
dtt.strptime(myduration, "%H:%M:%S") - dtt(1900, 1, 1)
também funciona ...Eu modifiquei a boa resposta de Virhilo com algumas atualizações:
3m0.25s
3 minutos, 0,25 segundos).
fonte
Se você usa Python 3, aqui está a versão atualizada da solução de Hari Shankar, que usei:
fonte
Django vem com a função de utilitário
parse_duration()
. Da documentação :fonte
Use a biblioteca isodate para analisar a string de duração ISO 8601. Por exemplo:
Consulte também Existe uma maneira fácil de converter a duração ISO 8601 em timedelta?
fonte