Os arquivos de dados horários das Estações Meteorológicas Automáticas (EMA) do INMET obtidos através do seoma.rs@inmet.gov.br para os estados do Sul do Brasil são disponibilizados em formato texto (ASCII).
Os dados são armazenados em uma estrutura retangular, com as observações ao longo das linhas e as variáveis ao longo das colunas. Eventualmente, os arquivos podem tem sido editados manualmente e esse padrão pode ser quebrado. Então uma da observação (linha) pode não conter os campos de todas as variáveis meteorológicas (colunas).
A seguir mostra-se como usar o pacote inmetwrangler
para importar os dados
das EMA do INMET e diagnosticar onde (arquivos, linhas e colunas) ocorrem estes problemas. Esta informação pode servir para verificação dos dados com a agência que forneceu os dados, para descartar a hipótese de algum problema na extração dos dados ou na operação manual dos arquivos texto.
Instalação do pacote inmetwrangler
:
library(devtools)
install_github("lhmet/inmetwrangler")
library(inmetwrangler)
knitr::opts_chunk$set(comment = "#>")
Outros pacotes necessários para reproduzir os exemplos mostrados a seguir:
library(knitr) library(tidyverse) library(stringr)
Os dados dos exemplos abaixo são disponibilizados com o próprio pacote
inmetwrangler
, no diretório de instalação do pacote. Os arquivos
disponibilizados são:
#.libPaths() # arquivos disponíveis list.files(system.file("extdata", package = "inmetwrangler")) #, full.names = TRUE)
O caminho para um arquivo de dados pode ser obtido da seguinte forma:
system.file("extdata", "A838.txt", package = "inmetwrangler")
system.file("extdata", "A838.txt", package = "inmetwrangler") %>% stringr::str_replace_all(.libPaths()[1], "~/.R")
Os arquivos de dados horários das EMA tem um cabeçalho que pode ocupar de 2 a 4 linhas. Essa variação no formato dos arquivos pode ser devido a forma como os dados foram extraídos do banco de dados ou dependente do técnico responsável pelo banco de dados.
Os arquivos disponibilizados com o pacote são exemplos de arquivos com
diferentes cabeçalhos^[O cabeçalho inclui o comando SQL
usado para
extração dos dados a partir do banco de dados.].
ex_file_h4 <- system.file("extdata", "A819.txt", package = "inmetwrangler") head(read_lines(ex_file_h4))
ex_file_h3 <- system.file("extdata", "A804.txt", package = "inmetwrangler") head(read_lines(ex_file_h3))
ex_file_h2 <- system.file("extdata", "A852.txt", package = "inmetwrangler") head(read_lines(ex_file_h2))
A função import_txt_files_inmet()
além de importar os arquivos de dados
horários considerando os diferentes cabeçalhos dos arquivos, também é usada para
diagnosticar problemas na estrutura dos dados.
Conforme nota técnica do INMET os arquivos devem conter 23 variáveis meteorológicas (especificadas na seção IMPORTANDO DADOS), uma com identificador da EMA e 4 com informação do ano, mês, dia e hora (UTC); totalizando 28 colunas. Mas nos arquivos ASCII fornecidos há uma coluna adicional com o símbolo "=". Então o total esperado de colunas nos arquivos texto é de 29 colunas^[A coluna excedente é desconsiderada na saída da função import_txt_files_inmet()
, mas para diagnóstico de problemas ela é considerada.].
myfile <- system.file("extdata", "A838.txt", package = "inmetwrangler") A838_problems <- import_txt_files_inmet(files = myfile, verbose = FALSE, only.problems = TRUE, full.names = TRUE) kable(A838_problems)
A tabela de dados mostrada é auto-explicativa, mas é importante notar a diferença entre row
(linha nos dados importados) e row_file
(linha no arquivo ASCII). Foram encontradas r nrow(A838_problems)
observações com menor n° de variáveis que o esperado.
Esperavam-se 29 variáveis para a observação da linha 9712 (9741), entretanto, o arquivo contém apenas 14 (24) variáveis naquela linha.
Para verificar no arquivo original é possível abri-lo em um editor de texto, ou executar os comandos abaixo em que importamos o arquivo da EMA de interesse (myfile
) e filtrarmos os dados entre uma linha acima (ir - 1
) e uma abaixo (ir + 1
) da linha com problema (ir
).
for (i in seq_along(A838_problems$row)) { cat(" ------------", "Problem ", i, " ------------", "\n") ir <- A838_problems$row_file[i] print(read_lines(file = myfile)[(ir - 1):(ir + 1)]) }
myfile <- system.file("extdata", "A852.txt", package = "inmetwrangler") myfile A852_problems <- import_txt_files_inmet(files = myfile, verbose = FALSE, only.problems = TRUE) kable(A852_problems)
Foram encontradas r nrow(A852_problems)
observações com mais variáveis do que o esperado (29). Essas linhas são consecutivas, desde a linha r min(A852_problems$row_file)
no arquivo original até a linha r max(A852_problems$row_file)
.
Quando os arquivos importados não apresentarem problemas a tabela com os
problemas estará vazia. Então a função import_txt_files_inmet
quando usada
para detectar problemas (import_txt_files_inmet(..., only.problems = TRUE)
)
retornará informação somente sobre os arquivos com problemas
(caso eles os tenham).
txt_files <- list.files(system.file("extdata", package = "inmetwrangler"), full.names = TRUE) txt_files_no_prob <- discard(txt_files, ~str_detect(.x, "A852|A838")) # somente arquivos sem problemas estruturais basename(txt_files_no_prob) probs <- import_txt_files_inmet(txt_files_no_prob, verbose = FALSE, only.problems = TRUE, full.names = FALSE) probs str(probs)
A função import_txt_files_inmet()
importa arquivos de dados
horários dando conta das diferenças de cabeçalhos dos arquivos e preenche (ou remove) as variáveis de uma observação com campos incompletos (excedentes).
# merge data files hdata <- import_txt_files_inmet(files = txt_files, verbose = FALSE) kable(head(hdata[, 1:10])) kable(tail(hdata[, 1:10]))
session_info()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.