Estoy jugando con cosas de fecha y hora en R y no puedo averiguar cómo alterar el origen de la hora para aceptar fechas más antiguas. Por ejemplo:

vals <- as.character(60:70)
as.POSIXct(vals, origin="1900-01-01", format = "%y")
# [1] "2060-07-25 EDT" "2061-07-25 EDT" "2062-07-25 EDT" "2063-07-25 EDT"
# [5] "2064-07-25 EDT" "2065-07-25 EDT" "2066-07-25 EDT" "2067-07-25 EDT"
# [9] "2068-07-25 EDT" "1969-07-25 EDT" "1970-07-25 EDT"

¿Es posible ajustar el origen de modo que as.POSIXct devuelva 1960 para una entrada de "60"? ¿Cuál es la mejor forma de manejar un siglo ambiguo?

0
dayne 26 jul. 2016 a las 05:14

2 respuestas

La mejor respuesta

No puede hacer que as.POSIXct devuelva 1960 para una entrada de "60". Ver ?strptime:

 ‘%y’ Year without century (00-99).  On input, values 00 to 68 are
      prefixed by 20 and 69 to 99 by 19 - that is the behaviour
      specified by the 2004 and 2008 POSIX standards, but they do
      also say ‘it is expected that in a future version the default
      century inferred from a 2-digit year will change’.

Debe anteponer el siglo a la cadena y usar el formato "%Y" si desea un comportamiento diferente con as.POSIXct.

vals <- as.character(60:70)
as.POSIXct(paste0("19",vals), format = "%Y")

Si algunas de las fechas de dos dígitos son posteriores al 2000, puede usar ifelse o algo similar para anteponer un siglo diferente.

newvals <- paste0(ifelse(vals < "20", "20", "19"), vals)
1
Joshua Ulrich 26 jul. 2016 a las 03:03

Suponiendo que desee algunos años superiores a 2000, es posible que no sea conveniente anteponer 19 al vector.

En este caso, restar 100 años podría ser mejor.

library(lubridate)
vals <- as.character(60:70)
vals <- as.POSIXct(vals, origin="1900-01-01", format = "%y")
vals[year(vals)>2059] <- vals[year(vals)>2059] - years(100)
vals

 [1] "1960-07-25 CDT" "1961-07-25 CDT" "1962-07-25 CDT"
 [4] "1963-07-25 CDT" "1964-07-25 CDT" "1965-07-25 CDT"
 [7] "1966-07-25 CDT" "1967-07-25 CDT" "1968-07-25 CDT"
[10] "1969-07-25 CDT" "1970-07-25 CDT"
1
shayaa 26 jul. 2016 a las 02:33