Я просто закодировал это быстро, но я думаю, что он должен работать. Однако я не уверен, что это самое элегантное решение.
# 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: не отлаживается, поэтому проверьте его и дайте мне знать.