Importando Datas do Excel

Olá. Estou com uma dúvida que envolve faxina de dados.

Estou com uma base de orçamento de Covid em Juiz de Fora emo Excel, que possui varias colunas com data. Ela está disponível aqui se for o caso. PJF | Juiz de Fora contra o Coronavírus

Como há linhas com caracteres no meio da coluna, não dá pra especificar o formato do objeto da coluna na hora de importar.

Mas em geral: quando leio essa tabela, o formato dd/mm/yyyy vira aquele formato estranho do excel, em que 01/01/1901 é 1, 2 é 02/01/1901, até 443322 que são as datas atuais.

ao que parece, na mesma coluna, hora tenho o formato 443322 e dd/mm/yyyy como vocês podem ver abaixo.

qual a melhor forma de lidar com esse problema e evitar o 443322? na importação? ou existe alguma função que trabalha com esses numeros do excel?

Oi Marcello!
Eu não conheço alguma forma de tratar isso direto na importação, e sim na limpeza.

Também não conheço uma função única que trate direito esses dois casos, a forma que eu pensei é assim: (o código não está reprodutível pois usei um caminho absoluto para abrir o arquivo)

Usando dplyr::mutate() e dplyr::case_when(), podemos criar regras para tentar identificar qual é o formato. Daria pra fazer algo mais robusto com regex, mas fui pelo caminho mais simples usando o número de caracteres.

Para os casos onde as datas estão como 443322, eu usei a função openxlsx::convertToDate(), para converter essas datas do excel.

Para os casos das datas no formato dia/mes/ano, eu usei a função readr::parse_date(), com o argumento format = c("%d/%m/%Y") para deixar claro qual é o formato de data usada.

    library(magrittr, include.only = "%>%")
    dataset <- readxl::read_excel("~/Downloads/14052021.xls",
                                  skip = 3)


    dataset %>%
      janitor::clean_names() %>% # limpar os nomes das colunas
      tidyr::drop_na(tidyselect::everything()) %>% # remover as linhas que unicamente só possuem NA
      dplyr::mutate(
        prazo_contratual_data =
          dplyr::case_when(
            nchar(prazo_contratual) == 5 ~  openxlsx::convertToDate(prazo_contratual),
            nchar(prazo_contratual) == 10 ~ readr::parse_date(prazo_contratual, format =  c("%d/%m/%Y"))
          )
      ) %>% # daqui pra baixo é só pra facilitar a visualização e comparar as diferenças
      dplyr::select(prazo_contratual, prazo_contratual_data)  %>% 
      dplyr::sample_n(10) %>% 
      knitr::kable()
prazo_contratual prazo_contratual_data
10 dias NA
44223 2021-01-27
44348 2021-06-01
21/01/2021 2021-01-21
43957 2020-05-06
44028 2020-07-16
44217 2021-01-21
21/01/2021 2021-01-21
10 dias NA
44292 2021-04-06

Acho que essa é uma solução não muito elegante, mas não conheço algo mais direto.
Se alguém conhecer alguma função que lide bem com os dois casos, por favor avisem!

2 curtidas

Essa função com as funções do open_xlsx:: convertToDate e a parse_date já resolvem meus problemas. Acho que é exatamente o que eu precisava.

muito obrigado @beatrizmilz !!

1 curtida

Ah, que bom então :slight_smile: De nada!