import os import pandas as pd import numpy as np from time import sleep def listar_pastas(diretorio): pastas = [nome for nome in os.listdir(diretorio) if os.path.isdir(os.path.join(diretorio, nome))] return pastas def completar_com_valores_menos_um(dados, estacao, output): dados_df = pd.read_csv(dados, sep=';', decimal=',', parse_dates=['DATA'], dayfirst=True) start_date = '1980-01-01' end_date = '2024-12-31' filtered_df = dados_df[(dados_df['DATA'] >= start_date) & (dados_df['DATA'] <= end_date)] dados_df=filtered_df dados_df.head(2) estacao_df = pd.read_csv(estacao, encoding='utf-8', sep=';', decimal=',') estacao_df.head(2) log_info = [] # Variável booleana para verificar se encontrou somente valores <= -1 somente_valores_menores_ou_igual_a_menos_um = False # Variáveis para armazenar o último código e valor encontrados ultimo_codigo_achado = None ultimo_valor_atualizado = None # Copiar dados_df para uma variável para atualização AtualizaDados = dados_df.copy() # Caminho do arquivo de log no diretório atual log_file_path = os.path.join(os.getcwd(), output+'.txt') # Abrir o arquivo de log para escrita total = len(AtualizaDados) with open(log_file_path, 'w') as log_file: # Iterar sobre AtualizaDados para atualizar os valores for index, row in AtualizaDados.iterrows(): print(f"\rProcessando linha {index+1}/{total}", end='') valor = row['VALOR'] data = row['DATA'] if valor <= -1: log_file.write(f"Código: {row['CODIGO']}, Data: {row['DATA']}, Valor: {valor}\n") codigo_filtrado = row['CODIGO'] linhas_filtradas = estacao_df.loc[estacao_df['CODIGO'] == codigo_filtrado] # Iterar sobre os códigos próximos (1codigo, 2codigo, 3codigo) for i in range(1, 11): # Considerando as três primeiras colunas de códigos codigo_proximo = linhas_filtradas[f'{i}c'].iloc[0] filtro = (dados_df['CODIGO'] == codigo_proximo) & (dados_df['DATA'] == data) valor_proximo = dados_df.loc[filtro, 'VALOR'].values log_file.write(f"{i}codigo: {codigo_proximo} Valor: {valor_proximo}\n") # Verificar se o valor encontrado não é menor ou igual a -1 if len(valor_proximo) > 0 and valor_proximo[0] > -1: AtualizaDados.loc[index, 'VALOR'] = valor_proximo[0] ultimo_codigo_achado = codigo_proximo ultimo_valor_atualizado = valor_proximo[0] log_file.write(f"Valor atual {row['VALOR']} - Valor atualizado para: {valor_proximo[0]}\n") break # Parar o loop se encontrar um valor válido else: log_file.write(f"****Não achou o valor \n") somente_valores_menores_ou_igual_a_menos_um = True log_info.append({ 'CODIGO': row['CODIGO'], 'DATA': row['DATA'], 'VALOR': valor, 'ULTIMO_CODIGO_ACHADO': ultimo_codigo_achado, 'ULTIMO_VALOR_ATUALIZADO': ultimo_valor_atualizado }) log_file.write("---------------------------------------------------\n") # Criar DataFrame com as informações do log e salvar em um CSV log_df = pd.DataFrame(log_info) log_df.to_csv(output+'-valores de origem .csv', sep=";", encoding='utf-8', decimal=',', index=False) # Exibir mensagem após completar o processo print("Dados atualizados:") AtualizaDados.to_csv(output, sep=";", encoding='utf-8', decimal=',', index=False) #print(AtualizaDados) return somente_valores_menores_ou_igual_a_menos_um #df.to_csv(output_csv, sep=";", encoding='utf-8', decimal=',', index=False) def processar_arquivos_com_menos_um(): print("Carregando arquivo...") diretorio = 'data' # nome da pasta principal pastas = listar_pastas(diretorio) destino= "20dadosmenosum" if not os.path.exists(destino): os.makedirs(destino) print(f"Pasta '{destino}' criada.") for pasta in pastas: print(f"Encontrada pasta: {pasta}") estacao = f"./11estacaoproxima/proxima_{pasta}.csv" dados = f"./01processados/{pasta}_dados.csv" output=f"./{destino}/{pasta}_processada.csv" completar_com_valores_menos_um(dados, estacao, output) sleep(3)