Muitos conjuntos de dados reais incluem datas e horas, e uma operação comum na ciência de dados é calcular a diferença de tempo entre dois momentos no tempo.
As unidades que usamos para medir datas e horas (anos, meses, dias, horas, minutos, segundos) não são as mais fáceis de trabalhar, sobretudo quando essas unidades têm dimensões irregulares.
No entanto, o tipo de dados timedelta do Python, que faz parte do módulo datetime, lida com a complexidade de trabalhar com intervalos de tempo.
Vamos começar com uma resposta bem curta sobre o que é o timedelta do Python e, em seguida, continuar com mais detalhes.
Os dois tipos de dados mais importantes e usados com frequência no módulo datetime são timedelta e datetime. Enquanto os objetos datetime representam momentos específicos no tempo (ex.: 1º de janeiro de 2024 às 10h30), os objetos timedelta representam durações ou intervalos entre dois momentos. Pense nisso como a diferença entre perguntar "Quando?" (datetime) e "Por quanto tempo?" (timedelta).
Considere duas datas, que podem ser representadas por meio de dois objetos datetime. Ao subtrair uma data de outra, é criado um objeto timedelta que representa o intervalo de tempo entre as datas:
O resultado mostra que as duas datas têm exatamente 147 dias de diferença. No exemplo a seguir, usamos a data e a hora em que o código é executado chamando datetime.datetime.now():
Agora o objeto timedelta mostra o tempo decorrido entre o início de 2024 e a data e hora em que o código é executado.
Neste artigo, vamos analisar melhor o timedelta do Python.
Criação de objetos timedelta
Na seção anterior, criamos um objeto timedelta a partir de dois objetos datetime, mas também podemos criar um intervalo de tempo diretamente chamando o construtor timedelta():
Qualquer uma das unidades de tempo a seguir é válida quando ao chamar timedelta():
semanas
dias
horas
minutos
segundos
milissegundos
microssegundos
Este tutorial aborda mais detalhadamente como os intervalos de tempo são armazenados em um objeto timedelta.
Aritmética básica com timedelta
Também podemos fazer operações aritméticas com objetos timedelta. Considere os três objetos datetime a seguir, que representam as datas de lançamento do Python 1.0, Python 2.0 e Python 3.0. Quando um objeto datetime é subtraído de outro, é criado um objeto timedelta:
A saída mostra o número de dias entre as versões do Python 1.0 e 2.0 e entre as versões do Python 2.0 e 3.0. Os intervalos de tempo são objetos timedelta.
Também é possível fazer a soma e a subtração de objetos timedelta e objetos datetime. Vamos somar um timedelta com days=100 a release_date_python_3:
O Python 3.0 foi lançado em 3 de dezembro de 2008. Ao somar 100 dias a essa data, obtemos 13 de março de 2009.
No entanto, também podemos fazer operações aritméticas diretamente com os objetos timedelta:
print("Difference between gap 1 and gap 2")print(time_between_1_and_2 - time_between_2_and_3)print("Sum of gap 1 and gap 2")print(time_between_1_and_2 + time_between_2_and_3)Tecnologia
Difference between gap 1 and gap 2
556 days, 0:00:00
Sum of gap 1 and gap 2
6496 days, 0:00:00Tecnologia
O resultado confirma que é possível subtrair e adicionar objetos timedelta. Também é possível fazer operações de multiplicação e divisão:
print("Multiply time interval by 3:")print(time_between_1_and_2 *3)print("Divide time interval by 3:")print(time_between_1_and_2 /3)Tecnologia
Multiply time interval by 3:
10578 days, 0:00:00
Divide time interval by 3:
1175 days, 8:00:00Tecnologia
Podemos ainda comparar objetos timedelta:
print("Check if gap 1 is greater than gap 2")print(time_between_1_and_2 > time_between_2_and_3)Tecnologia
O resultado confirma que o intervalo entre as datas de lançamento do Python 1.0 e do Python 2.0 é maior do que o intervalo entre o Python 2.0 e o Python 3.0.
Principais atributos e métodos do timedelta
Um objeto timedelta representa um intervalo de tempo armazenando o número de dias, segundos e microssegundos. Essas são as três únicas unidades de tempo representadas por atributos na classe timedelta:
Embora a chamada para timedelta() inclua argumentos para semanas, horas, minutos e milissegundos, o construtor converte essas unidades em dias, segundos e microssegundos. As chamadas de print() incluem f-strings com sinal de igual = para exibir o nome da variável e seu valor. Para saber mais sobre f-strings, confira este tutorial sobre formatação de f-strings em Python.
Outra ferramenta útil da classe timedelta é o método total_seconds(). Esse método retorna o intervalo de tempo total em segundos:
print("Total time interval in seconds:")print(interval.total_seconds())Tecnologia
Total time interval in seconds:
642121.042Tecnologia
Esse valor representa o intervalo de tempo total em segundos. Não é o mesmo que o valor de .seconds, que mostra apenas o componente de segundos do intervalo, sem levar em conta os dias e os microssegundos.
Você pode usar o valor retornado por .total_seconds() para converter o intervalo de tempo em qualquer outra unidade:
print("Total time interval in days:")print(interval.total_seconds()/3600/24)Tecnologia
Total time interval in days:
7.431956504629629Tecnologia
O resultado mostra o intervalo de tempo em dias, já que o valor retornado por .total_seconds() é dividido pelo número de segundos em uma hora e pelo número de horas em um dia.
Exemplo do timedelta: cálculo do crescimento
Vejamos um exemplo. A loja online de uma empresa que vende livros sobre Python registra todas as vendas. Estes são os dados de um cliente:
data ={"customer_id":3542,"sales":[{"date":"2024-04-21T13:23:45","price":24.99,"quantity":1},{"date":"2024-02-13T10:54:12","price":24.99,"quantity":2},{"date":"2024-01-08T20:32:24","price":18.99,"quantity":1},],}Tecnologia
Precisamos calcular a diferença de tempo entre o primeiro e o último pedidos de um cliente. Os pedidos estão sempre em ordem cronológica na lista que contém todas as vendas.
A primeira etapa é extrair as datas dessa estrutura aninhada e convertê-las em objetos datetime. Por sorte, os registros de data e hora estão no formato padrão ISO 8601 (AAAA-MM-DDTHH:MM:SS), portanto podemos usar o conveniente método fromisoformat():
sales = data["sales"]
dates =[]for item in sales:
date = datetime.datetime.fromisoformat(item["date"])
dates.append(date)print(dates)Tecnologia
A diferença entre a primeira e a última data fornece um objeto timedelta. O código exibe time_span, que mostra o número de dias, horas, minutos e segundos. Também exibimos time_span.days para mostrar apenas o número total de dias.
2. Ao calcular um intervalo de tempo entre duas datas em fusos horários diferentes, timedelta converte as datas em datas UTC antes de calcular a diferença de horário:
A data em some_date mostra o início do novo ano. Esse é um objeto datetime ingênuo, pois não tem informações sobre o fuso horário. Entretanto, some_date_lon e some_date_nyc são objetos datetime conscientes, pois representam o início do ano novo em Londres e Nova York, respectivamente.
O timedelta obtido pela subtração dos dois objetos datetime conscientes mostra um intervalo de tempo de cinco horas, que é a diferença de horário UTC.
3. Diferenças no horário de verão não são levadas em conta pelo timedelta:
nyc = zoneinfo.ZoneInfo("America/New_York")
first_time = datetime.datetime.strptime("2024-03-10 1:00am","%Y-%m-%d %I:%M%p")
first_time = first_time.replace(tzinfo=nyc)
second_time = datetime.datetime.strptime("2024-03-10 3:00am","%Y-%m-%d %I:%M%p")
second_time = second_time.replace(tzinfo=nyc)
time_difference = second_time - first_time
print("Time difference between the first and second time:")print(time_difference)print("Checking the DST status of the first and second time:")print(f"{first_time.dst()=}")print(f"{second_time.dst()=}")Tecnologia
Time difference between the first and second time:
2:00:00
Checking the DST status of the first and second time:
first_time.dst() = datetime.timedelta(0)
second_time.dst() = datetime.timedelta(seconds=3600)Tecnologia
Os dois horários representam 1h00 e 3h00 do dia 3 de março de 2024, em Nova York. O horário de verão começou às 2h da manhã no mesmo dia em que os relógios passaram para as 3h. A diferença entre os dois horários resulta em um timedelta que representa duas horas, embora apenas uma hora tenha se passado entre os dois horários devido ao início do horário de verão.
Podemos converter em UTC se precisarmos do intervalo real decorrido:
first_time_utc = first_time.astimezone(zoneinfo.ZoneInfo("UTC"))
second_time_utc = second_time.astimezone(zoneinfo.ZoneInfo("UTC"))
time_difference_utc = second_time_utc - first_time_utc
print("Actual time difference between the first and second time:")print(time_difference_utc)Tecnologia
Actual time difference between the first and second time:
1:00:00Tecnologia
A conversão em UTC antes de subtrair os objetos datetime fornece o tempo real entre os dois objetos datetime.
Conclusão
A classe timedelta do Python oferece métodos fáceis para lidar com intervalos de tempo, simplificando o trabalho com períodos de tempo em várias unidades. Analisamos como criar objetos timedelta e fazer operações aritméticas com eles, como adição, subtração, multiplicação e divisão.
Você pode ler mais sobre como lidar com datas e horas nos artigos a seguir:
Aprenda a dividir listas Python com técnicas como slicing, compreensão de listas e itertools. Descubra quando usar cada método para um tratamento ideal dos dados.
Em Python, tudo é objeto. Números, cadeias de caracteres (strings), DataFrames, e até mesmo funções são objetos. Especificamente, qualquer coisa que você usa no Python tem uma classe, um modelo associado por trás.
Introdução às estruturas de dados do Python: saiba mais sobre tipos de dados e estruturas de dados primitivas e não primitivas, como strings, listas, pilhas etc.
Explore vários tipos de gráficos de dados, desde os mais comuns até os avançados e não convencionais, o que eles mostram, quando usá-los, quando evitá-los e como criá-los e personalizá-los em Python.
Muitos conjuntos de dados reais incluem datas e horas, e uma operação comum na ciência de dados é calcular a diferença de tempo entre dois momentos no tempo.
As unidades que usamos para medir datas e horas (anos, meses, dias, horas, minutos, segundos) não são as mais fáceis de trabalhar, sobretudo quando essas unidades têm dimensões irregulares.
No entanto, o tipo de dados
timedeltado Python, que faz parte do módulodatetime, lida com a complexidade de trabalhar com intervalos de tempo.Vamos começar com uma resposta bem curta sobre o que é o
timedeltado Python e, em seguida, continuar com mais detalhes.Para saber mais sobre datas e horas em Python, confira este curso sobre Como Trabalhar com Datas e Horas em Python.
Resposta curta: o que é o timedelta do Python?
Os dois tipos de dados mais importantes e usados com frequência no módulo
datetimesãotimedeltaedatetime. Enquanto os objetosdatetimerepresentam momentos específicos no tempo (ex.: 1º de janeiro de 2024 às 10h30), os objetostimedeltarepresentam durações ou intervalos entre dois momentos. Pense nisso como a diferença entre perguntar "Quando?" (datetime) e "Por quanto tempo?" (timedelta).Considere duas datas, que podem ser representadas por meio de dois objetos
datetime. Ao subtrair uma data de outra, é criado um objetotimedeltaque representa o intervalo de tempo entre as datas:O resultado mostra que as duas datas têm exatamente 147 dias de diferença. No exemplo a seguir, usamos a data e a hora em que o código é executado chamando datetime.datetime.now():
Agora o objeto
timedeltamostra o tempo decorrido entre o início de 2024 e a data e hora em que o código é executado.Neste artigo, vamos analisar melhor o
timedeltado Python.Criação de objetos timedelta
Na seção anterior, criamos um objeto
timedeltaa partir de dois objetosdatetime, mas também podemos criar um intervalo de tempo diretamente chamando o construtortimedelta():O intervalo é de dez dias e uma hora. Também podemos usar outras unidades de tempo ao criar uma instância do
timedelta:Qualquer uma das unidades de tempo a seguir é válida quando ao chamar
timedelta():Este tutorial aborda mais detalhadamente como os intervalos de tempo são armazenados em um objeto
timedelta.Aritmética básica com timedelta
Também podemos fazer operações aritméticas com objetos
timedelta. Considere os três objetosdatetimea seguir, que representam as datas de lançamento do Python 1.0, Python 2.0 e Python 3.0. Quando um objetodatetimeé subtraído de outro, é criado um objetotimedelta:A saída mostra o número de dias entre as versões do Python 1.0 e 2.0 e entre as versões do Python 2.0 e 3.0. Os intervalos de tempo são objetos
timedelta.Também é possível fazer a soma e a subtração de objetos
timedeltae objetosdatetime. Vamos somar umtimedeltacomdays=100arelease_date_python_3:O Python 3.0 foi lançado em 3 de dezembro de 2008. Ao somar 100 dias a essa data, obtemos 13 de março de 2009.
No entanto, também podemos fazer operações aritméticas diretamente com os objetos
timedelta:O resultado confirma que é possível subtrair e adicionar objetos
timedelta. Também é possível fazer operações de multiplicação e divisão:Podemos ainda comparar objetos
timedelta:O resultado confirma que o intervalo entre as datas de lançamento do Python 1.0 e do Python 2.0 é maior do que o intervalo entre o Python 2.0 e o Python 3.0.
Principais atributos e métodos do timedelta
Um objeto
timedeltarepresenta um intervalo de tempo armazenando o número de dias, segundos e microssegundos. Essas são as três únicas unidades de tempo representadas por atributos na classetimedelta:Embora a chamada para
timedelta()inclua argumentos para semanas, horas, minutos e milissegundos, o construtor converte essas unidades em dias, segundos e microssegundos. As chamadas deprint()incluem f-strings com sinal de igual = para exibir o nome da variável e seu valor. Para saber mais sobre f-strings, confira este tutorial sobre formatação de f-strings em Python.Outra ferramenta útil da classe
timedeltaé o métodototal_seconds(). Esse método retorna o intervalo de tempo total em segundos:Esse valor representa o intervalo de tempo total em segundos. Não é o mesmo que o valor de
.seconds, que mostra apenas o componente de segundos do intervalo, sem levar em conta os dias e os microssegundos.Você pode usar o valor retornado por
.total_seconds()para converter o intervalo de tempo em qualquer outra unidade:O resultado mostra o intervalo de tempo em dias, já que o valor retornado por
.total_seconds()é dividido pelo número de segundos em uma hora e pelo número de horas em um dia.Exemplo do timedelta: cálculo do crescimento
Vejamos um exemplo. A loja online de uma empresa que vende livros sobre Python registra todas as vendas. Estes são os dados de um cliente:
Precisamos calcular a diferença de tempo entre o primeiro e o último pedidos de um cliente. Os pedidos estão sempre em ordem cronológica na lista que contém todas as vendas.
A primeira etapa é extrair as datas dessa estrutura aninhada e convertê-las em objetos
datetime. Por sorte, os registros de data e hora estão no formato padrão ISO 8601 (AAAA-MM-DDTHH:MM:SS), portanto podemos usar o conveniente métodofromisoformat():A lista
datescontém objetosdatetimecom as datas de cada pedido. Por fim, podemos calcular o intervalo de tempo entre o primeiro e o último pedidos:A diferença entre a primeira e a última data fornece um objeto
timedelta. O código exibetime_span, que mostra o número de dias, horas, minutos e segundos. Também exibimostime_span.dayspara mostrar apenas o número total de dias.Se quiser saber mais sobre a conversão de strings em datetime, confira este tutorial sobre Python: de string para datetime.
Dicas rápidas ao usar o timedelta
Vamos dar uma olhada em algumas questões a ter em mente ao usar o
timedeltado Python:1. É melhor usar argumentos de palavras-chave ao chamar
timedelta()para evitar erros com unidades:2. Ao calcular um intervalo de tempo entre duas datas em fusos horários diferentes,
timedeltaconverte as datas em datas UTC antes de calcular a diferença de horário:A data em
some_datemostra o início do novo ano. Esse é um objetodatetimeingênuo, pois não tem informações sobre o fuso horário. Entretanto,some_date_lonesome_date_nycsão objetosdatetimeconscientes, pois representam o início do ano novo em Londres e Nova York, respectivamente.O
timedeltaobtido pela subtração dos dois objetosdatetimeconscientes mostra um intervalo de tempo de cinco horas, que é a diferença de horário UTC.3. Diferenças no horário de verão não são levadas em conta pelo
timedelta:Os dois horários representam 1h00 e 3h00 do dia 3 de março de 2024, em Nova York. O horário de verão começou às 2h da manhã no mesmo dia em que os relógios passaram para as 3h. A diferença entre os dois horários resulta em um
timedeltaque representa duas horas, embora apenas uma hora tenha se passado entre os dois horários devido ao início do horário de verão.Podemos converter em UTC se precisarmos do intervalo real decorrido:
A conversão em UTC antes de subtrair os objetos
datetimefornece o tempo real entre os dois objetosdatetime.Conclusão
A classe
timedeltado Python oferece métodos fáceis para lidar com intervalos de tempo, simplificando o trabalho com períodos de tempo em várias unidades. Analisamos como criar objetostimedeltae fazer operações aritméticas com eles, como adição, subtração, multiplicação e divisão.Você pode ler mais sobre como lidar com datas e horas nos artigos a seguir: