Ajouter / soustraire 6 mois (durée de l'obligation) en R en utilisant lubridate
je cherche à ajouter et soustraire six mois de façon fiable avec lubridate.
Par exemple, 12/31/2014 -> 6/30/2015 et 2/28/2014 -> 8/31/2014
etc.
Le problème as.Date("2014-12-31")+months(6)
, c'est qu'il donne une NA
. Alternativement, le deuxième résultat est 8/28/2014 parce qu'il ne se contente pas d'ajouter 6 mois au mois et ensuite savoir où le jour devrait finir dépendant du mois.
Est-il possible de corriger rapidement ce? Pour le moment, je suis construire une fonction pour utiliser essentiellement un commutateur et de considérer chaque mois, mais c'est très long et j'ai des problèmes avec elle aussi.
Merci!
2 réponses
lubridate
function %m+%
peut être utile ici:
additionner et soustraire les mois à une date sans dépasser le dernier jour du nouveau mois
as.Date("2014-12-31") %m+% months(6)
# [1] "2015-06-30"
pour traiter aussi le second cas, vous devrez arrondir au mois le plus proche en utilisant ceiling_date
, et soustraire un jour en utilisant days
.
ceiling_date(as.Date("2014-02-28") %m+% months(6), unit = "month") - days(1)
# [1] "2014-08-31"
j'ai juste codé ça rapidement, mais je pense que ça devrait marcher. Je ne suis pas sûr que ce soit la solution la plus élégante, cependant.
# 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: pas de débogage, alors vérifiez-le vous-même et faites-le moi savoir.