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.

Pré-requisitos

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)

Dados

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")

Arquivos com cabeçalho variável

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))

Detectando problemas

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.

Caso 1: menos variáveis do que o esperado

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)])
}

Caso 2: mais variáveis do que o esperado

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).

Caso 3: arquivos sem problemas

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)

Importando os arquivos de dados

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]))

Informações da sessão

session_info()


lhmet/inmetwrangler documentation built on May 15, 2019, 1:42 p.m.