quimicos - Agregue/reste 6 meses(tiempo de enlace) en R usando lubricante
tipos de enlaces covalentes (2)
Estoy buscando sumar y restar seis meses de manera confiable con lubricante.
Por ejemplo, 12/31/2014 -> 30/06/2015 y 2/28/2014 -> 8/31/2014
etc.
El problema con as.Date("2014-12-31")+months(6)
, es que produce una NA
. Alternativamente, el segundo resultado es el 28/8/2014 porque no solo agrega 6 meses al mes y luego sabe dónde debería terminar el día dependiendo del mes.
¿Hay alguna manera de corregir esto rápidamente? En este momento, estoy creando una función para usar básicamente un interruptor y considerar cada mes, pero esto es muy largo y también tengo problemas con él.
¡Gracias!
Acabo de codificar esto rápidamente, pero creo que debería funcionar. Sin embargo, no estoy seguro de si es la solución más elegante.
# up = 1, down = -1
six.mo.mover<-function(date,up.or.down) {
last.day <- month(date) != month(as.Date(date)+1)
if(last.day) {
adj.date <- as.Date(date) - day(as.Date(date)-1) + up.or.down*months(6)
adj.mo <- month(adj.date)
if (adj.mo == 2) {
dy <- 28 + leap_year(year(adj.date))
}
else {
dy <- 31-(adj.mo-1)%%7%%2
}
adj.date + days(dy-1)
}
else {
as.Date(date)+up.or.down*months(6)
}
}
NB: no está depurado, así que compruébalo tú mismo y avísame.
La función de lubridate
%m+%
puede ser útil aquí:
Suma y resta meses a una fecha sin exceder el último día del nuevo mes
as.Date("2014-12-31") %m+% months(6)
# [1] "2015-06-30"
Para manejar también el segundo caso, deberá redondear al mes más cercano usando ceiling_date
y restar un día usando days
.
ceiling_date(as.Date("2014-02-28") %m+% months(6), unit = "month") - days(1)
# [1] "2014-08-31"