Files
jean_app/iniciochuvosa.py
2025-06-01 16:44:49 -03:00

184 lines
6.6 KiB
Python
Executable File

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)