yyyy now fecha actual r date posix zoo r-faq

now - Conversión de año y mes(formato "yyyy-mm") a una fecha?



jquery get date dd/mm/yyyy (7)

Creo que la solución de @ben-rollert es una buena solución.

Solo debe tener cuidado si desea usar esta solución en una función dentro de un paquete nuevo.

Al desarrollar paquetes, se recomienda utilizar la sintaxis packagename::function_name() (ver http://kbroman.org/pkg_primer/pages/depends.html ).

En este caso, debe usar la versión de as.Date() definida por la biblioteca del zoo .

Aquí hay un ejemplo :

> devtools::session_info() Session info ---------------------------------------------------------------------------------------------------------------------------------------------------- setting value version R version 3.3.1 (2016-06-21) system x86_64, linux-gnu ui RStudio (1.0.35) language (EN) collate C tz <NA> date 2016-11-09 Packages -------------------------------------------------------------------------------------------------------------------------------------------------------- package * version date source devtools 1.12.0 2016-06-24 CRAN (R 3.3.1) digest 0.6.10 2016-08-02 CRAN (R 3.2.3) memoise 1.0.0 2016-01-29 CRAN (R 3.2.3) withr 1.0.2 2016-06-20 CRAN (R 3.2.3) > as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : do not know how to convert ''zoo::as.yearmon("1989-10", "%Y-%m")'' to class “Date” > zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) [1] "1989-10-01"

Entonces, si está desarrollando un paquete, la buena práctica es usar:

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))

Tengo un conjunto de datos que se ve así:

Month count 2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386

Quiero trazar los datos (meses como valores x y cuenta como valores y). Dado que hay lagunas en los datos, quiero convertir la información del mes en una fecha. Lo intenté:

as.Date("2009-03", "%Y-%m")

Pero no funcionó. ¿Qué pasa? Parece que como.Date () también requiere un día y no puede establecer un valor estándar para el día? ¿Qué función resuelve mi problema?


Dado que las fechas corresponden a un valor numérico y una fecha de inicio, de hecho necesita el día. Si realmente necesita que sus datos estén en formato de fecha, puede simplemente arreglar el día al primero de cada mes manualmente pegándolo a la fecha:

month <- "2009-03" as.Date(paste(month,"-01",sep=""))


De hecho, como se mencionó anteriormente (y en otros lugares en SO), para convertir la cadena en una fecha, necesita una fecha específica del mes. Desde la página del manual as.Date() :

Si la cadena de fecha no especifica la fecha por completo, la respuesta devuelta puede ser específica del sistema. El comportamiento más común es suponer que un año, mes o día faltante es el actual. Si especifica una fecha incorrecta, las implementaciones confiables darán un error y la fecha se informará como NA. Desafortunadamente, algunas implementaciones comunes (como glibc ) no son confiables y adivinan el significado deseado.

Una solución simple sería pegar la fecha "01" en cada fecha y usar strptime() para indicarlo como el primer día de ese mes.

Para aquellos que buscan un poco más de antecedentes sobre el procesamiento de fechas y horas en R:

En R, los tiempos usan las clases POSIXct y POSIXlt y las fechas usan la clase Date .

Las fechas se almacenan como el número de días desde el 1 de enero de 1970 y los tiempos se almacenan como el número de segundos desde el 1 de enero de 1970.

Así por ejemplo:

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 operaciones en fechas y horas:

plt - as.POSIXlt(d) # Time difference of 16420.61 days

Y para procesar las fechas, puede usar strptime() (tomando prestados estos ejemplos de la página del 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"


La solución más concisa si necesita que las fechas estén en formato de fecha:

library(zoo) month <- "2000-03" as.Date(as.yearmon(month)) [1] "2000-03-01"

as.Date arreglará el primer día de cada mes para un objeto yearmon para usted.


Prueba esto. (Aquí usamos text=Lines para mantener el ejemplo autocontenido pero en realidad lo reemplazaríamos con el nombre del archivo).

Lines <- "2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386" library(zoo) z <- read.zoo(text = Lines, FUN = as.yearmon) plot(z)

El eje X no es tan bonito con estos datos, pero si tiene más datos en realidad podría estar bien o puede usar el código para un eje X elaborado que se muestra en la sección de ejemplos de ?plot.zoo .

La serie de zoos, z , que se creó anteriormente tiene un índice de tiempo "yearmon" y se ve así:

> z Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 12 310 2379 234 14 1 34 2386

"yearmon" se puede usar solo:

> as.yearmon("2000-03") [1] "Mar 2000"

Nota:

  1. Los objetos de la clase "yearmon" se ordenan en orden "yearmon" .

  2. Esto trazará los puntos mensuales a intervalos igualmente espaciados, que es lo que se busca; sin embargo, si se desea trazar los puntos a intervalos espaciados desigualmente espaciados en proporción a la cantidad de días en cada mes, entonces convierta el índice de z a la clase "Date" : time(z) <- as.Date(time(z)) .


También puede lograr esto con las funciones parse_date_time o fast_strptime del lubridate :

> parse_date_time(dates1, "ym") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" > fast_strptime(dates1, "%Y-%m") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

La diferencia entre esos dos es que parse_date_time permite la especificación de formato estilo fast_strptime , mientras que fast_strptime requiere la misma especificación de formato que strptime .

Para especificar la zona horaria, puede usar el parámetro tz :

> parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

Cuando tenga irregularidades en sus datos de fecha y hora, puede usar el parámetro truncated para especificar cuántas irregularidades están permitidas:

> parse_date_time(dates2, "ymdHMS", truncated = 3) [1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"

Datos usados:

dates1 <- c("2009-01","2009-02","2009-03") dates2 <- c("2012-06-01 12:23","2012-06-01 12",''2012-06-01")


Usando el paquete anytime :

library(anytime) anydate("2009-01") # [1] "2009-01-01"