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 elegante que se muestra en la sección de ejemplos de ?plot.zoo
.
La serie del zoológico z
, que se creó arriba, tiene un "yearmon"
índice de tiempo 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"
también se puede utilizar solo:
> as.yearmon("2000-03")
[1] "Mar 2000"
Nota:
"yearmon"
los objetos de clase se clasifican en orden de calendario.
Esto trazará los puntos mensuales a intervalos igualmente espaciados que es probablemente lo que se desea; sin embargo, si se deseara para trazar los puntos a intervalos espaciados desigualmente espaciadas en proporción al número de días de cada mes a continuación, convertir el índice de z
a "Date"
clase: time(z) <- as.Date(time(z))
.
as.Date(month, format='%Y-%m-01')
y lograr el mismo resultado. Esto me "parece" preferible, ya que especificar la misma fecha en cada mes tiene más que ver con el formato de la fecha que con la manipulación de cadenas, pero tal vez eso sea una tontería.> as.Date("2016-01", format="%Y-%m-01") # [1] NA
. Estoy usando R 3.3.1La 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
fijará el primer día de cada mes en un objeto yearmon para usted.fuente
También puede lograr esto con las funciones
parse_date_time
ofast_strptime
dellubridate
paquete:> 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 de estilo lubridate, mientras quefast_strptime
requiere la misma especificación de formato questrptime
.Para especificar la zona horaria, puede utilizar el
tz
parámetro -parámetro:> parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
Cuando tiene irregularidades en sus datos de fecha y hora, puede usar el
truncated
parámetro -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")
fuente
date
usandoparse_date_time
, ¿hay alguna manera de verla en un orden diferente al"2009-01-01 UTC"
usandolubridate
package? Preferiría ver el día primero en mi conjunto de datos, por ejemplo01-01-2009
.?format
; por ejemplo:format(your_date, "%d-%m-%Y")
. Sin embargo, esto tiene una desventaja: obtendrás el valor de un personaje y no una fecha.format
por la razón que mencionas, pensé que podría haber una forma de incorporar esto en ellubridate
paquete, pero parece que no la hay.Usando el paquete en cualquier momento :
library(anytime) anydate("2009-01") # [1] "2009-01-01"
fuente
anydate("2009-03")
si siempre se elige el primer día del mes.?strptime
: la cadena de entrada no necesita especificar la fecha completamente: se asume que los segundos, minutos u horas no especificados son cero, y un año, mes o día no especificado es el actual. (Sin embargo, si se especifica un mes, el día de ese mes tiene que ser especificado por% d o% e ya que el día actual del mes no necesita ser válido para el mes especificado). Parece que la respuesta de megatron contiene una pieza similar de documentación deas.Date
.anytime('1870-01')
De hecho, como se mencionó anteriormente (y en otras partes de SO), para convertir la cadena en una fecha, necesita una fecha específica del mes. Desde la
as.Date()
página del manual:Una solución simple sería pegar la fecha
"01"
en cada fecha y usarlastrptime()
para indicarla como el primer día de ese mes.Para aquellos que buscan un poco más de información sobre el procesamiento de fechas y horas en R:
En R, los tiempos usan
POSIXct
y lasPOSIXlt
clases y las fechas usan laDate
clase.Las fechas se almacenan como el número de días desde el 1 de enero de 1970 y las horas 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 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"
fuente
Creo que la solución de @ ben-rollert es una buena solución.
Solo debe tener cuidado si desea utilizar esta solución en una función dentro de un nuevo paquete.
Al desarrollar paquetes, se recomienda utilizar la sintaxis
packagename::function_name()
(consulte http://kbroman.org/pkg_primer/pages/depends.html ).En este caso, debe utilizar la versión de
as.Date()
definida por elzoo
biblioteca.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"))
fuente