varias superponer sumar studio para meses manipulacion lineas graficos graficas fechas dias aƱos r date date-arithmetic

sumar - superponer graficas en r



Agregar un mes a una fecha (8)

Aquí hay una función que no requiere que se instalen paquetes. Le da un objeto Date (o un character que puede convertir en una Date ) y agrega n meses a esa fecha sin cambiar el día del mes (a menos que el mes en que aterrice no tenga suficientes días, en cuyo caso se predetermina al último día del mes devuelto). En caso de que no tenga sentido leerlo, hay algunos ejemplos a continuación.

Definición de función

addMonth <- function(date, n = 1){ if (n == 0){return(date)} if (n %% 1 != 0){stop("Input Error: argument ''n'' must be an integer.")} # Check to make sure we have a standard Date format if (class(date) == "character"){date = as.Date(date)} # Turn the year, month, and day into numbers so we can play with them y = as.numeric(substr(as.character(date),1,4)) m = as.numeric(substr(as.character(date),6,7)) d = as.numeric(substr(as.character(date),9,10)) # Run through the computation i = 0 # Adding months if (n > 0){ while (i < n){ m = m + 1 if (m == 13){ m = 1 y = y + 1 } i = i + 1 } } # Subtracting months else if (n < 0){ while (i > n){ m = m - 1 if (m == 0){ m = 12 y = y - 1 } i = i - 1 } } # If past 28th day in base month, make adjustments for February if (d > 28 & m == 2){ # If it''s a leap year, return the 29th day if ((y %% 4 == 0 & y %% 100 != 0) | y %% 400 == 0){d = 29} # Otherwise, return the 28th day else{d = 28} } # If 31st day in base month but only 30 days in end month, return 30th day else if (d == 31){if (m %in% c(1, 3, 5, 7, 8, 10, 12) == FALSE){d = 30}} # Turn year, month, and day into strings and put them together to make a Date y = as.character(y) # If month is single digit, add a leading 0, otherwise leave it alone if (m < 10){m = paste(''0'', as.character(m), sep = '''')} else{m = as.character(m)} # If day is single digit, add a leading 0, otherwise leave it alone if (d < 10){d = paste(''0'', as.character(d), sep = '''')} else{d = as.character(d)} # Put them together and convert return the result as a Date return(as.Date(paste(y,''-'',m,''-'',d, sep = ''''))) }

Algunos ejemplos

Agregar meses

> addMonth(''2014-01-31'', n = 1) [1] "2014-02-28" # February, non-leap year > addMonth(''2014-01-31'', n = 5) [1] "2014-06-30" # June only has 30 days, so day of month dropped to 30 > addMonth(''2014-01-31'', n = 24) [1] "2016-01-31" # Increments years when n is a multiple of 12 > addMonth(''2014-01-31'', n = 25) [1] "2016-02-29" # February, leap year

Restando meses

> addMonth(''2014-01-31'', n = -1) [1] "2013-12-31" > addMonth(''2014-01-31'', n = -7) [1] "2013-06-30" > addMonth(''2014-01-31'', n = -12) [1] "2013-01-31" > addMonth(''2014-01-31'', n = -23) [1] "2012-02-29"

Estoy tratando de agregar un mes a una fecha que tengo. Pero entonces no es posible de manera directa hasta el momento. Lo siguiente es lo que intenté.

d <- as.Date("2004-01-31") d + 60 # [1] "2004-03-31"

Agregar ayuda no será suficiente ya que el mes no se superpondrá.

seq(as.Date("2004-01-31"), by = "month", length = 2) # [1] "2004-01-31" "2004-03-02"

Por encima podría funcionar, pero nuevamente no es sencillo. También agrega 30 días o algo así a la fecha que tiene problemas como el siguiente

seq(as.Date("2004-01-31"), by = "month", length = 10) # [1] "2004-01-31" "2004-03-02" "2004-03-31" "2004-05-01" "2004-05-31" "2004-07-01" "2004-07-31" "2004-08-31" "2004-10-01" "2004-10-31"

En lo anterior, para las primeras 2 fechas, el mes no ha cambiado.

Además, el siguiente enfoque también falló durante el mes, pero fue un éxito durante el año

d <- as.POSIXlt(as.Date("2010-01-01")) d$year <- d$year +1 d # [1] "2011-01-01 UTC" d <- as.POSIXlt(as.Date("2010-01-01")) d$month <- d$month +1 d

Error en format.POSIXlt(x, usetz = TRUE) : argumento inválido ''x''

¿Cuál es el método correcto para hacer esto?


Convertí los pensamientos de Antonio en una función específica:

library(DescTools) > AddMonths(as.Date(''2004-01-01''), 1) [1] "2004-02-01" > AddMonths(as.Date(''2004-01-31''), 1) [1] "2004-02-29" > AddMonths(as.Date(''2004-03-30''), -1) [1] "2004-02-29"


Es ambiguo cuando dices "agregar un mes a una fecha".

Quieres decir

  1. agregar 30 días?
  2. aumentar el mes parte de la fecha en 1?

En ambos casos, un paquete completo para una simple adición parece un poco exagerado.

Para el primer punto, por supuesto, el operador simple + hará:

d=as.Date(''2010-01-01'') d + 30 #[1] "2010-01-31"

En cuanto a la segunda, simplemente crearía una función de una línea tan simple como eso (y con un alcance más general):

add.months= function(date,n) seq(date, by = paste (n, "months"), length = 2)[2]

Puedes usarlo con meses arbitrarios, incluido el negativo:

add.months(d, 3) #[1] "2010-04-01" add.months(d, -3) #[1] "2009-10-01"

Por supuesto, si desea agregar solo y a menudo un solo mes:

add.month=function(date) add.months(date,1) add.month(d) #[1] "2010-02-01"

Si agrega un mes al 31 de enero, desde el 31 de febrero no tiene sentido, lo mejor para hacer el trabajo es agregar los 3 días faltantes al mes siguiente, marzo. Entonces correctamente

add.month(as.Date("2010-01-31")) #[1] "2010-03-03"

En caso de que, por alguna razón muy especial, necesite poner un techo al último día disponible del mes, es un poco más largo:

add.months.ceil=function (date, n){ #no ceiling nC=add.months(date, n) #ceiling day(date)=01 C=add.months(date, n+1)-1 #use ceiling in case of overlapping if(nC>C) return(C) return(nC) }

Como de costumbre, puedes agregar una versión de un mes:

add.month.ceil=function(date) add.months.ceil(date,1)

Asi que:

d=as.Date(''2010-01-31'') add.month.ceil(d) #[1] "2010-02-28" d=as.Date(''2010-01-21'') add.month.ceil(d) #[1] "2010-02-21"

Y con decrementos:

d=as.Date(''2010-03-31'') add.months.ceil(d, -1) #[1] "2010-02-28" d=as.Date(''2010-03-21'') add.months.ceil(d, -1) #[1] "2010-02-21"

Además, no dijiste si te interesaba una solución escalar o vectorial. En cuanto a este último:

add.months.v= function(date,n) as.Date(sapply(date, add.months, n), origin="1970-01-01")

Nota: *apply familia destruye los datos de la clase, es por eso que tiene que ser reconstruido. La versión de vector trae:

d=c(as.Date(''2010/01/01''), as.Date(''2010/01/31'')) add.months.v(d,1) [1] "2010-02-01" "2010-03-03"

Espero que les haya gustado))


La forma más sencilla es convertir la fecha en formato POSIXlt. Luego realice la operación aritmética de la siguiente manera:

date_1m_fwd <- as.POSIXlt("2010-01-01") date_1m_fwd$mon <- date_1m_fwd$mon +1

Además, en caso de que desee tratar con columnas de fecha en data.table, desafortunadamente, el formato POSIXlt no es compatible.

Sin embargo, puede realizar el mes adicional usando códigos R básicos de la siguiente manera:

library(data.table) dt <- as.data.table(seq(as.Date("2010-01-01"), length.out=5, by="month")) dt[,shifted_month:=tail(seq(V1[1], length.out=length(V1)+3, by="month"),length(V1))]

Espero eso ayude.


La función %m+% de lubridate agrega un mes sin exceder el último día del nuevo mes.

library(lubridate) (d <- ymd("2012-01-31")) 1 parsed with %Y-%m-%d [1] "2012-01-31 UTC" d %m+% months(1) [1] "2012-02-29 UTC"


Vanilla R tiene una clase de tiempo difcil, pero el paquete Lubridate CRAN te permite hacer lo que pides:

require(lubridate) d <- as.Date(''2004-01-01'') month(d) <- month(d) + 1 day(d) <- days_in_month(d) d [1] "2004-02-29"

Espero que ayude.


"mondate" es algo similar a "Date" excepto que agregar n agrega n meses en lugar de n días:

> library(mondate) > d <- as.Date("2004-01-31") > as.mondate(d) + 1 mondate: timeunits="months" [1] 2004-02-29


addedMonth <- seq(as.Date(''2004-01-01''), length=2, by=''1 month'')[2] addedQuarter <- seq(as.Date(''2004-01-01''), length=2, by=''1 quarter'')[2]