Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Somar tempos do DataFrame

df

Tenho esse data frame e queria somar apenas os tempos de máquina parada. Já tentei algo mas não consegui, sou novo ainda com programação e tudo mais. Tentei isso:

pd.to_datetime(dados['Tempo'], format='%H:%M:%S')

condicao = ['MÁQUINA PARADA']
selecao = dados['Descricao'].isin(condicao)

mas quando eu usodados[(selecao)]['Tempo'].sum(), ele não somou, já tentei dados['Tempo'] = dados['Tempo'].astype(int), mas não funcionou, se alguém poder me ajudar fico grato.

4 respostas

Olá, Afonso! Tudo bem com você?

Você conseguiria compartilhar essa base de dados para eu realizar alguns testes e ser mais assertivo na resposta?

Aguardo retorno.

https://www.transfernow.net/dl/20220906Yi2X5KCV

solução!

Olá, Afonso.

Fiz a leitura da base de dados da seguinte forma:

import pandas as pd
dados = pd.read_csv('relatorio.csv')

Primeiramente vamos converter as colunas Data para datetime e Tempo para timedelta, pois todos os dados estão com o tipo object. Para comprovar isso execute o código dados.dtypes. Caso você não conheça esses dois tipos de dados, deixo como recomendação de leitura complementar a documentação do NumPy "Datetimes and Timedeltas", que aborda muito bem isso. Podemos fazer essa conversão da seguinte forma:

dados['Data'] = pd.to_datetime(dados['Data'])
dados['Tempo'] = pd.to_timedelta(dados['Tempo'])
dados.head()

Saída

PostosDescricaoDataTempo
0FUJI L1Fim OP2022-05-09 08:00:000 days 00:47:04
1FUJI L1EM OPERAÇÃO2022-05-09 08:47:040 days 00:02:24
2FUJI L1MÁQUINA PARADA2022-05-09 08:49:280 days 00:19:41
3FUJI L1MÁQUINA PARADA2022-05-09 09:09:090 days 00:00:34
4FUJI L1Inicio OP2022-05-09 09:09:430 days 00:00:04

Conferindo novamente o tipo das colunas, obtemos:

dados.dtypes

Saída

Postos                object
Descricao             object
Data          datetime64[ns]
Tempo        timedelta64[ns]
dtype: objec

Agora vamos utilizar o método groupby do pandas para realizar a soma de acordo com determinado grupo, que nesse caso vai ser a descrição. Caso você não conheça esse método, a aula "Criando agrupamentos" do curso "Python Pandas: tratando e analisando dados" aborda-o. O seguinte trecho de código realizar esse agrupamento:

grouped = dados['Tempo'].groupby(dados['Descricao']).sum()
grouped

Saída:

Descricao
AGUARDANDO LIBERAÇÃO CQ   0 days 00:21:09
AGUARDANDO O  PROCESSO    0 days 00:27:30
BUSCAR MATERIAL           0 days 01:23:01
EM OPERAÇÃO               0 days 04:38:00
Fim OP                    0 days 02:15:43
Inicio OP                 0 days 00:00:24
MÁQUINA PARADA            0 days 07:47:09
OPERADOR AUSENTE          0 days 01:03:39
PRODUÇÃO DE MELHORIAS     0 days 00:00:07
SERVIÇO DIGICON           0 days 06:19:25
SETUP                     0 days 05:10:28
Name: Tempo, dtype: timedelta64[ns]

No código estamos primeiro selecionando a coluna Tempo (dados['Tempo']), depois agrupamos pela descrição (.groupby(dados['Descricao']) e logo após para obtermos os valores das somas de cada uma das descrições utilizamos o método .sum(). Porém como você quer apenas os tempos de MÁQUINA PARADA, podemos fazer a filtragem da seguinte forma:

print(grouped['MÁQUINA PARADA'])

Saída:

0 days 07:47:09

Ou seja, o tempo total que a máquina ficou parada foi de 0 dias 7 horas 47 minutos e 9 segundos.

Espero ter ajudado e qualquer dúvida estou à disposição.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Muito obrigado!!