O padrão ISO 8601 define não apenas um formato de datas, mas também um formato para escrever durações — uma string como PT1H30M, que descreve de forma inequívoca e legível por máquina "1 hora 30 minutos".
A estrutura do formato
A string sempre começa com a letra P (period). Os componentes de data (anos, meses, dias) vêm logo após o P, enquanto os componentes de tempo (horas, minutos, segundos) vêm após a letra T, que separa a parte de data da parte de tempo. Por exemplo, P2DT4H significa "2 dias e 4 horas".
Por que a letra T é necessária
Sem o separador T, a letra M seria ambígua — ela representa tanto meses (na parte de data) quanto minutos (na parte de tempo). Por isso P1M significa "1 mês", enquanto PT1M significa "1 minuto".
Como o Python lida com esse formato
A biblioteca isodate em Python converte strings ISO 8601 duration diretamente em objetos timedelta, e o pandas aceita o mesmo formato ao interpretar colunas de duração em pd.to_timedelta(). Isso evita ter que escrever um parser manual só para transformar PT1H30M em algo que o código consiga somar ou comparar.
Para que serve isso
- Decifrar a duração de um vídeo ou evento a partir da resposta de uma API de terceiros.
- Gerar uma string de duração ISO 8601 válida para sua própria API ou feed de dados.
- Converter durações entre um formato legível por humanos e a notação ISO legível por máquina.
Segundos fracionários na notação
O padrão ISO 8601 permite uma parte fracionária apenas no último (o menor) componente da string — por exemplo, PT1.5S significa "1,5 segundo", e PT1H30.5M significa "1 hora 30,5 minutos". Uma parte fracionária em qualquer componente que não seja o último não é prevista pelo padrão.