Estou trabalhando com um formato de data antigo onde os dois primeiros dígitos representam o ano do século XX. As duas primeiras casas decimais são o mês (ou seja, 01-12) e a terceira e quarta casas decimais são o dia do mês (ou seja, 01-31). O problema é que os dias que terminam em zero (ou seja, 10, 20, 30) têm o zero à direita eliminado, de modo que alguns formatos de data têm apenas três casas decimais.
Como posso restaurar o zero à direita para poder converter esse formato de data antigo em um formato de data moderno (ou seja, aaaa-mm-dd)?
Exemplo:
library(tidyverse)
# Example data
xx <- data.frame(yr_mo_da = c('89.1208','89.1209','89.121', '89.1211'))
# My attempt to extract year, month, day from the old date format
# NOTE how the day is not extracted properly because there is not a fourth decimal place on Dec. 10
xx$year <- as.numeric(gsub("\\..*","",xx$yr_mo_da))
xx$month <- as.numeric(sub("^[0-9]+\\.([0-9]{2}).*", "\\1", xx$yr_mo_da))
xx$day <- as.numeric(sub("^[0-9]+\\.[0-9]{2}([0-9]{2}).*", "\\1", xx$yr_mo_da))
xx
#> yr_mo_da year month day
#> 1 89.1208 89 12 8.000
#> 2 89.1209 89 12 9.000
#> 3 89.121 89 12 89.121
#> 4 89.1211 89 12 11.000
# Create modern date format
xx <- xx %>%
mutate(year = year + 1900,
Date = make_date(year,month,day)) %>%
select(-c(yr_mo_da,year,day,month))
xx
#> Date
#> 1 1989-12-08
#> 2 1989-12-09
#> 3 <NA>
#> 4 1989-12-11
A saída correta deve ser semelhante a esta:
xx
#> Date
#> 1 1989-12-08
#> 2 1989-12-09
#> 3 1989-12-10
#> 4 1989-12-11
Criado em 05/09/2023 com reprex v2.0.2
Você pode primeiro preencher essas strings com "0":
Criado em 05/09/2023 com reprex v2.0.2
Você precisa converter os dados numéricos de volta em texto antes de analisar. Uma maneira apenas com base R é esta:
Se sua atribuição original não forçasse os valores dos caracteres, poderíamos pular o double
as.numeric()
.