import os import pandas as pd import numpy as np from time import sleep from datetime import datetime import csv def listar_csvs(diretorio): arquivos_csv = [nome for nome in os.listdir(diretorio) if nome.endswith('.csv') and os.path.isfile(os.path.join(diretorio, nome))] return arquivos_csv def processar_Classificao_Veranicos(): print("processar classificacao veranicos..") origem = '41veranicoschuvosa' files = listar_csvs(origem) decendio = carregar_decendios('decendio.csv') for file in files: print(f"Encontrada pasta: {file}") qtd_veranicos,cod_estacao = carregar_estacao_com_veranico(file) print(cod_estacao) rodar_decendio(decendio,qtd_veranicos, cod_estacao, file) 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, file): print("Decendio...") #estacoes= [2244035] #decendios = decendios.head(24) resultados = [] for estacao in estacoes: # percorre todas as estações array de 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 data_inicio = pd.to_datetime(selecao_estacao['INICIO']) data_fim = pd.to_datetime(selecao_estacao['FINAL']) filtro = decendios[(decendios['INICIO'] <= data_fim) & (decendios['FINAL'] >= data_inicio)] dia =selecao_estacao['QTDDIAS'] filtro = filtro.copy() # Para evitar avisos do Pandas filtro['dias_chuva'] = 0 filtro['dias_decendio'] = 0 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 filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1 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 filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1 filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1 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 filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1 filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1 filtro.loc[filtro.index[2], 'dias_decendio'] =diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL'])+1 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 filtro.loc[filtro.index[0], 'dias_decendio'] =diferenca_dias(filtro.iloc[0]['INICIO'], filtro.iloc[0]['FINAL'])+1 filtro.loc[filtro.index[1], 'dias_decendio'] =diferenca_dias(filtro.iloc[1]['INICIO'], filtro.iloc[1]['FINAL'])+1 filtro.loc[filtro.index[2], 'dias_decendio'] =diferenca_dias(filtro.iloc[2]['INICIO'], filtro.iloc[2]['FINAL'])+1 filtro.loc[filtro.index[3], 'dias_decendio'] =diferenca_dias(filtro.iloc[3]['INICIO'], filtro.iloc[3]['FINAL'])+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('************************************************************') resultados.append(pd.DataFrame(dados)) file= "./42veranicosclassificacao/descendio_"+file if os.path.exists(file): os.remove(file) pd.concat(resultados, ignore_index=True).to_csv(file, 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): print("Abrindo arquivo decendio.") dados_df = pd.read_csv(file, sep=';', decimal=',', parse_dates=['INICIO', 'FINAL'], dayfirst=True) start_date = '1980-01-01' end_date = '2022-12-31' filtered_df = dados_df[(dados_df['INICIO'] >= start_date) & (dados_df['FINAL'] <= end_date)] dados_df=filtered_df #dados_df.to_csv('-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False) return dados_df def carregar_estacao_com_veranico(file): print("Abrindo estacao com veranico") dados_df = pd.read_csv('./41veranicoschuvosa/'+file, sep=';', decimal=',', parse_dates=['INICIO', 'FINAL']) codigos_unicos = dados_df['CODIGO'].unique() # Retorna uma lista de valores únicos return dados_df, codigos_unicos