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!

18
demandé sur Michael Clinton 2014-03-25 12:22:01

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"
45
répondu Henrik 2017-08-11 11:26:30

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.

1
répondu Jacob M. Morley 2014-03-25 08:57:46