Na verdade, como foi mencionado acima (e em outro lugar no SO), para converter a string em uma data, você precisa de uma data específica do mês. Na as.Date()
página do manual:
Se a string de data não especificar a data completamente, a resposta retornada pode ser específica do sistema. O comportamento mais comum é presumir que um ano, mês ou dia ausente é o atual. Se especificar uma data incorretamente, implementações confiáveis darão um erro e a data será relatada como NA. Infelizmente, algumas implementações comuns (como glibc
) não são confiáveis e adivinham o significado pretendido.
Uma solução simples seria colar a data "01"
em cada data e usá strptime()
-la para indicá-la como o primeiro dia daquele mês.
Para aqueles que procuram um pouco mais de fundo sobre datas e horários de processamento em R:
Em R, os tempos usam POSIXct
e as POSIXlt
classes e as datas usam a Date
classe.
As datas são armazenadas como o número de dias desde 1º de janeiro de 1970 e as horas são armazenadas como o número de segundos desde 1º de janeiro de 1970.
Então, por exemplo:
d <- as.Date("1971-01-01")
unclass(d) # one year after 1970-01-01
# [1] 365
pct <- Sys.time() # in POSIXct
unclass(pct) # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt) # up is now a list containing the components of time
names(up)
# [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone"
# [11] "gmtoff"
up$hour
# [1] 9
Para realizar operações em datas e horas:
plt - as.POSIXlt(d)
# Time difference of 16420.61 days
E para processar datas, você pode usar strptime()
(pegando emprestado esses exemplos da página do manual):
strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"
# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"