diff --git a/app.py b/app.py index b849d81..dfa6152 100644 --- a/app.py +++ b/app.py @@ -12,6 +12,7 @@ def mostrar_menu(): print("30 - Inicio e fim estacao chuvosa") print("40 - Processar veranicos com estacao chuvosa") print("60 - Processar Classicação veranicos") + print("70 - Transformar veranicos") print("0 - Sair") def main(): @@ -40,6 +41,9 @@ def main(): elif opcao == "60": classificacao_veranicos.processar_Classificao_Veranicos() + elif opcao == "70": + classificacao_veranicos.transformar_decendio() + elif opcao == "0": diff --git a/classificacao_veranicos.py b/classificacao_veranicos.py index 4802d50..4ebfb31 100644 --- a/classificacao_veranicos.py +++ b/classificacao_veranicos.py @@ -26,17 +26,38 @@ def processar_Classificao_Veranicos(): +from datetime import datetime +def diferenca_dias(data1, data2): + formato = "%Y-%m-%d" + + # Converter para string se for Timestamp + if not isinstance(data1, str): + data1 = data1.strftime(formato) + if not isinstance(data2, str): + data2 = data2.strftime(formato) + + # Verificar se as datas são válidas + if not data1 or not data2: + print(f"Erro: Data inválida -> data1: {data1}, data2: {data2}") + return None + + try: + d1 = datetime.strptime(data1, formato) + d2 = datetime.strptime(data2, formato) + return (d2 - d1).days + except ValueError as e: + print(f"Erro ao converter datas: {data1}, {data2} - {e}") + return None def rodar_decendio(decendios,qtd_veranicos, estacoes): print("Decendio...") - resultados = [] - amplitude=0 - + + estacoes= [2244035] #decendios = decendios.head(24) - + resultados = [] for estacao in estacoes: # percorre todas as estações array de estacoes @@ -44,9 +65,8 @@ def rodar_decendio(decendios,qtd_veranicos, estacoes): #estacao_fitrada = qtd_veranicos['CODIGO'] == estacao estacao_fitrada = qtd_veranicos[qtd_veranicos['CODIGO'] == estacao] estacao_fitrada = estacao_fitrada.head(10) - + for index, selecao_estacao in estacao_fitrada.iterrows(): # Itera pelas linhas do DataFrame - print(index," ------------------------------------------") data_inicio = pd.to_datetime(selecao_estacao['INICIO']) data_fim = pd.to_datetime(selecao_estacao['FINAL']) @@ -58,32 +78,86 @@ def rodar_decendio(decendios,qtd_veranicos, estacoes): dia =selecao_estacao['QTDDIAS'] # Adicionar colunas FINICIO e FFINAL filtro = filtro.copy() # Para evitar avisos do Pandas - filtro['FINICIO'] = data_inicio - filtro['FFINAL'] = data_fim - - for index, selecao_filtro in filtro.iterrows(): - des = selecao_filtro['DECENDIO'] + #filtro['FINICIO'] = data_inicio + #filtro['FFINAL'] = data_fim + # filtro['dias'] = filtro.apply(lambda row: diferenca_dias(row['INICIO'], row['FINAL']), axis=1) + filtro['dias_chuva'] = 0 + #filtro.apply(lambda row: diferenca_dias(row['FINICIO'], row['FINAL']), axis=1) + + diferenca=diferenca_dias(data_inicio, data_fim) + + + quantidade_veranicos = len(filtro) # Conta o número de linhas + print(index,"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -") + print ('estacao: ',selecao_estacao , 'data_inicio' , '--- ', data_fim ,' Qtd Dias: ', diferenca) + if quantidade_veranicos <=0: + print(f"Tem algum problema registros ({quantidade_veranicos} linhas).") + elif quantidade_veranicos <= 1: + print(f"Tem mais de 1 registros ({quantidade_veranicos} linhas).") + filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, data_fim)+1 + + + print(filtro) + elif quantidade_veranicos <= 2: + print(f"Tem mais de 2 registros ({quantidade_veranicos} linhas).") + filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL'])+1 + filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], data_fim)+1 + + print(filtro) + + elif quantidade_veranicos <= 3: + print(f"Tem mais de 3 registros ({quantidade_veranicos} linhas).") + filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL'])+1 + filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL']) +1 + filtro.loc[filtro.index[2], 'dias_chuva'] = diferenca_dias(filtro.iloc[2]['INICIO'], data_fim)+1 print(filtro) - print(des) + + elif quantidade_veranicos <= 4: + print(f"Tem mais de 4 registros ({quantidade_veranicos} linhas).") + filtro.loc[filtro.index[0], 'dias_chuva'] = diferenca_dias(data_inicio, filtro.iloc[0]['FINAL']) + filtro.loc[filtro.index[1], 'dias_chuva'] = diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL']) + filtro.loc[filtro.index[2], 'dias_chuva'] = diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL']) + filtro.loc[filtro.index[3], 'dias_chuva'] = diferenca_dias(filtro.iloc[3]['INICIO'], data_fim)+1 + print(filtro) + dados = [] + print('->', selecao_estacao) + for index, row in filtro.iterrows(): + dados.append({ + 'CODIGO': selecao_estacao['CODIGO'], + 'DECENDIO': row['DECENDIO'], + 'AMPLITUDE': row['dias_chuva'] + }) + print('************************************************************') - resultado = { - 'estacao': estacao, - 'descendio':selecao_filtro['DECENDIO'], + resultados.append(pd.DataFrame(dados)) + + - 'amplitude': 0 - - } - resultados.append(resultado) - - - - save = pd.DataFrame(resultados) - os.remove('saida.csv') - save.to_csv('saida.csv', sep=';', encoding='utf-8', index=False) + + if os.path.exists('saida.csv'): os.remove('saida.csv') + pd.concat(resultados, ignore_index=True).to_csv('saida.csv', sep=';', encoding='utf-8', index=False) + + + + +def transformar_decendio(): + df = pd.read_csv("saida.csv", sep=";") + # Transformar a tabela para o formato desejado + df_pivot = df.pivot(index="CODIGO", columns="DECENDIO", values="AMPLITUDE") + + # Resetar o índice para salvar corretamente + df_pivot.reset_index(inplace=True) + + # Salvar o resultado no CSV + df_pivot.to_csv("saida_transformado.csv", sep=";", encoding="utf-8", index=False) + + + + def carregar_decendios(file): diff --git a/log_registros.txt b/log_registros.txt new file mode 100644 index 0000000..b01556a --- /dev/null +++ b/log_registros.txt @@ -0,0 +1,105 @@ +0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-09-24 00:00:00 +FINAL 1980-10-06 00:00:00 +QTDDIAS 13 +Name: 0, dtype: object | Data Início: 1980-09-24 00:00:00 | Data Fim: 1980-10-06 00:00:00 | Qtd Dias: 12 +Tem mais de 2 registros (2 linhas). + DECENDIO INICIO FINAL dias_chuva +2 3DSEP 1980-09-21 1980-09-30 6.0 +3 1DOCT 1980-10-01 1980-10-10 6.0 + +1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-10-16 00:00:00 +FINAL 1980-10-30 00:00:00 +QTDDIAS 15 +Name: 1, dtype: object | Data Início: 1980-10-16 00:00:00 | Data Fim: 1980-10-30 00:00:00 | Qtd Dias: 14 +Tem mais de 2 registros (2 linhas). + DECENDIO INICIO FINAL dias_chuva +4 2DOCT 1980-10-11 1980-10-20 4.0 +5 3DOCT 1980-10-21 1980-10-31 10.0 + +2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-11-01 00:00:00 +FINAL 1980-11-07 00:00:00 +QTDDIAS 7 +Name: 2, dtype: object | Data Início: 1980-11-01 00:00:00 | Data Fim: 1980-11-07 00:00:00 | Qtd Dias: 6 +Tem mais de 1 registro (1 linhas). + DECENDIO INICIO FINAL dias_chuva +6 1DNOV 1980-11-01 1980-11-10 7.0 + +3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-11-14 00:00:00 +FINAL 1980-11-19 00:00:00 +QTDDIAS 6 +Name: 3, dtype: object | Data Início: 1980-11-14 00:00:00 | Data Fim: 1980-11-19 00:00:00 | Qtd Dias: 5 +Tem mais de 1 registro (1 linhas). + DECENDIO INICIO FINAL dias_chuva +7 2DNOV 1980-11-11 1980-11-20 6.0 + +4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-11-26 00:00:00 +FINAL 1980-11-30 00:00:00 +QTDDIAS 5 +Name: 4, dtype: object | Data Início: 1980-11-26 00:00:00 | Data Fim: 1980-11-30 00:00:00 | Qtd Dias: 4 +Tem mais de 1 registro (1 linhas). + DECENDIO INICIO FINAL dias_chuva +8 3DNOV 1980-11-21 1980-11-30 5.0 + +5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-12-04 00:00:00 +FINAL 1980-12-13 00:00:00 +QTDDIAS 10 +Name: 5, dtype: object | Data Início: 1980-12-04 00:00:00 | Data Fim: 1980-12-13 00:00:00 | Qtd Dias: 9 +Tem mais de 2 registros (2 linhas). + DECENDIO INICIO FINAL dias_chuva +9 1DDEC 1980-12-01 1980-12-10 6.0 +10 2DDEC 1980-12-11 1980-12-20 3.0 + +6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1980-12-16 00:00:00 +FINAL 1980-12-20 00:00:00 +QTDDIAS 5 +Name: 6, dtype: object | Data Início: 1980-12-16 00:00:00 | Data Fim: 1980-12-20 00:00:00 | Qtd Dias: 4 +Tem mais de 1 registro (1 linhas). + DECENDIO INICIO FINAL dias_chuva +10 2DDEC 1980-12-11 1980-12-20 5.0 + +7 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1981-01-04 00:00:00 +FINAL 1981-01-08 00:00:00 +QTDDIAS 5 +Name: 7, dtype: object | Data Início: 1981-01-04 00:00:00 | Data Fim: 1981-01-08 00:00:00 | Qtd Dias: 4 +Tem mais de 1 registro (1 linhas). + DECENDIO INICIO FINAL dias_chuva +12 1DJAN 1981-01-01 1981-01-10 5.0 + +8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1981-01-28 00:00:00 +FINAL 1981-02-06 00:00:00 +QTDDIAS 10 +Name: 8, dtype: object | Data Início: 1981-01-28 00:00:00 | Data Fim: 1981-02-06 00:00:00 | Qtd Dias: 9 +Tem mais de 2 registros (2 linhas). + DECENDIO INICIO FINAL dias_chuva +14 3DJAN 1981-01-21 1981-01-31 3.0 +15 1DFEB 1981-02-01 1981-02-10 6.0 + +9 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Estação: CODIGO 2244035 +INICIO 1981-02-12 00:00:00 +FINAL 1981-03-06 00:00:00 +QTDDIAS 23 +Name: 9, dtype: object | Data Início: 1981-02-12 00:00:00 | Data Fim: 1981-03-06 00:00:00 | Qtd Dias: 22 +Tem mais de 3 registros (3 linhas). + DECENDIO INICIO FINAL dias_chuva +16 2DFEB 1981-02-11 1981-02-20 8.0 +17 3DFEB 1981-02-21 1981-02-28 7.0 +18 1DMAR 1981-03-01 1981-03-10 6.0 diff --git a/planilhas/Sem título 2.ods b/planilhas/Sem título 2.ods new file mode 100644 index 0000000..ea99629 Binary files /dev/null and b/planilhas/Sem título 2.ods differ diff --git a/planilhas/decendios_filtered_1980_2025.xlsx b/planilhas/decendios_filtered_1980_2025.xlsx new file mode 100644 index 0000000..5519ef2 Binary files /dev/null and b/planilhas/decendios_filtered_1980_2025.xlsx differ diff --git a/planilhas/logica.ods b/planilhas/logica.ods new file mode 100644 index 0000000..64e486a Binary files /dev/null and b/planilhas/logica.ods differ diff --git a/saida.csv b/saida.csv index bd6d44c..50df781 100644 --- a/saida.csv +++ b/saida.csv @@ -1,17 +1,17 @@ -estacao;descendio;amplitude -2244035;3DSEP;0 -2244035;1DOCT;0 -2244035;2DOCT;0 -2244035;3DOCT;0 -2244035;1DNOV;0 -2244035;2DNOV;0 -2244035;3DNOV;0 -2244035;1DDEC;0 -2244035;2DDEC;0 -2244035;2DDEC;0 -2244035;1DJAN;0 -2244035;3DJAN;0 -2244035;1DFEB;0 -2244035;2DFEB;0 -2244035;3DFEB;0 -2244035;1DMAR;0 +CODIGO;DECENDIO;AMPLITUDE +2244035;3DSEP;7 +2244035;1DOCT;6 +2244035;2DOCT;5 +2244035;3DOCT;10 +2244035;1DNOV;7 +2244035;2DNOV;6 +2244035;3DNOV;5 +2244035;1DDEC;7 +2244035;2DDEC;3 +2244035;2DDEC;5 +2244035;1DJAN;5 +2244035;3DJAN;4 +2244035;1DFEB;6 +2244035;2DFEB;9 +2244035;3DFEB;8 +2244035;1DMAR;6