import os import pandas as pd import numpy as np from time import sleep import csv from datetime import datetime def listar_pastas(diretorio): pastas = [nome for nome in os.listdir(diretorio) if os.path.isdir(os.path.join(diretorio, nome))] return pastas def filtro_setembro_abril_estacao(dados, output_csv): # Lista dos anos para os quais queremos selecionar os dados print("**********************************************************\n") print('PERIDODO DE ANALISE 1980 -2024') anos = list(range(1980, 2024)) # De 1980 a 2024 # Ler os dados do CSV dados_df = pd.read_csv(dados, sep=';', decimal=',', parse_dates=['DATA'], dayfirst=True) #dados_df['CODIGO'] = dados_df['CODIGO'].astype(int) # DataFrame para armazenar os dados selecionados dados_selecionados = pd.DataFrame() for ano in anos: # Selecionar os dados de 1 de setembro de 'ano' a 30 de abril do próximo ano ('ano' + 1) inicio = f'{ano}-09-01' fim = f'{ano+1}-04-30' selecao = (dados_df['DATA'] >= inicio) & (dados_df['DATA'] <= fim) dados_selecionados = pd.concat([dados_selecionados, dados_df[selecao]]) # Salvar os dados selecionados em um novo arquivo CSV dados_selecionados['CODIGO'] = dados_selecionados['CODIGO'].astype(int) dados_selecionados.to_csv(output_csv, sep=';', encoding='utf-8', index=False, decimal=',') def estacaochuvosa(dados, output_csv): print(dados) with open(output_csv, 'w') as file: cabecalho = ['CODIGO', 'INICIO','FINAL'] writer = csv.DictWriter(file, fieldnames=cabecalho,delimiter=';') writer.writeheader() # Escreve o cabeçalho # Ler os dados do CSV dados_df = pd.read_csv(dados, sep=';', decimal=',') # dados['VALOR'] = dados['VALOR'].astype(str) # Garantir que todos os valores são strings try: # Garantir que os valores numéricos estão corretos antes de processar dados_df['VALOR'] = dados_df['VALOR'].astype(str).str.replace(',', '.') # Verificar se alguma linha ainda tem valores inválidos antes da conversão for index, valor in dados_df['VALOR'].items(): try: dados_df.at[index, 'VALOR'] = float(valor) except ValueError: print(f"Erro ao converter 'VALOR' na linha {index + 2}: '{valor}'") # +2 pois index começa em 0 e CSV tem cabeçalho # Converter a coluna inteira para float após a verificação dados_df['VALOR'] = dados_df['VALOR'].astype(float) # Tratar valores NaN substituindo por 0 dados_df['VALOR'] = dados_df['VALOR'].fillna(0) dados_df['CODIGO'] = dados_df['CODIGO'].astype(int) except Exception as e: print(f"Erro geral ao converter a coluna 'VALOR': {e}") #invalid_values = dados_df[~dados_df['DATA'].str.replace(',', '.').str.replace('.', '', 1).str.isnumeric()] #print(invalid_values) # Garantir que a coluna 'DATA' é do tipo datetime com o formato correto try: dados_df['DATA'] = pd.to_datetime(dados_df['DATA'], format='%Y-%m-%d', errors='raise') except Exception as e: raise ValueError(f"Erro ao converter a coluna 'DATA': {e}") estacao = dados_df['CODIGO'].unique() #anos = list(range(1980, 2023)) # De 1980 a 2022 print("**********************************************************\n") print('PERIDODO DE ANALISE 1980 -2024') anos = list(range(1980, 2024)) # De 1980 a 2022 print(estacao) total = len(estacao) #for xrow in estacao: #percorre a lista das estacoes for index, xrow in enumerate(estacao): print(f"\restacao chuvosa linha {index+1}/{total}", end='') nome_estacao=xrow for ano in anos: data_inicio = datetime.strptime(f'{ano}-09-01', '%Y-%m-%d') data_fim = datetime.strptime(f'{ano+1}-04-30', '%Y-%m-%d') df_inciochuva = dados_df[(dados_df['CODIGO'] == nome_estacao) &(dados_df['DATA'] >= data_inicio) & (dados_df['DATA'] <= data_fim)] marcador_inicio=False marcador_final=False somador_ml=0 somador_ml_final_chuva=0 for index, row in df_inciochuva.iterrows(): # print(index, ' ', row) leitura_chuva = float(row['VALOR'])#float(row['VALOR'].replace(',', '.')) if leitura_chuva>=0: somador_ml= somador_ml+leitura_chuva if somador_ml>=10 and not marcador_inicio: marcador_inicio=True data_incio_chuva= row['DATA'] ano_atual= row['DATA'].year #print ('estacao:', nome_estacao,'INCIO:', data_incio_chuva, 'MM', somador_ml) somador_ml=0 marcador_final=False #print ('estacao:',ano_do_incio_chuva) df_final_chuva = df_inciochuva[::-1] for index, row in df_final_chuva.iterrows(): leitura_chuva= row['VALOR'] if leitura_chuva>=0: somador_ml_final_chuva= somador_ml_final_chuva+leitura_chuva; if somador_ml_final_chuva>=5 and not marcador_final: marcador_final=True data_final_chuva=row['DATA'] somador_ml_final_chuva=0 marcador_inicio=False #print ('ano final chuva:', ano_do_incio_chuva+1) # print ('estacao:', nome_estacao,'INCIO:', data_incio_chuva,'FINAL:', data_final_chuva ) with open(output_csv, 'a') as file: writer = csv.DictWriter(file, fieldnames=cabecalho, delimiter=';') writer.writerow({'CODIGO':nome_estacao, 'INICIO':data_incio_chuva.strftime('%Y-%m-%d'),'FINAL':data_final_chuva.strftime('%Y-%m-%d')}) def processar_inicio_fim_estacao_chuvosa(): print("Estacao chuvosa...") diretorio = 'data' # nome da pasta principal pastas = listar_pastas(diretorio) destino= "30estacaochuvosa" if not os.path.exists(destino): os.makedirs(destino) print(f"Pasta '{destino}' criada.") for pasta in pastas: print(f"Encontrada pasta: {pasta}") dados = f"./20dadosmenosum/{pasta}_processada.csv" estacao =f"./{pasta}" output_csv=f"./{destino}/{pasta}_filtro_setembro_abril.csv" estacao_chuvosa=f"./{destino}/{pasta}_estacao_chuvosa.csv" filtro_setembro_abril_estacao(dados, output_csv) sleep(3) estacaochuvosa(output_csv, estacao_chuvosa)