2016-05-25 9 views
2

Das folgende R Verhalten mir ein Rätsel:Monate() Operator in lubridate produziert NA

> EndDate<-as.Date("2016-03-31") 
> EndDate-months(2) 
[1] "2016-01-31" 

> EndDate<-as.Date("2016-04-30") 
> EndDate-months(2) 
[1] NA 

Warum wird die erste Arbeit und die zweiten nicht?

Antwort

1

Dies ist absichtlich.

Sie können durch die lubridate documentation lesen.

Insbesondere könnten Sie tun:

EndDate%m-%months(2) 
[1] "2016-02-29" 

Dies wird die Subtraktion und automatisch rückgängig zu machen, das Datum der ersten ‚echte date‘ im Fall durchzuführen, dass die Subtraktion zu einem Nicht-Echt Datum führt.

Wohlgemerkt, wenn Sie stattdessen vorwärts rollen wollten, müssten Sie ein wenig mehr Arbeit erledigen (soweit ich sagen kann, wünschte ich, es gäbe einen einfachen Operator wie %m-f% oder eine andere Ableitung des bereits vorhandenen %m-%). Aber so etwas funktioniert auch:

EndDate%m-%months(2) + if(is.na(EndDate-months(2))) {days(1)} else {0} 
"2016-03-01"