# [R-sig-finance] Problems with monthly sequences

Gabor Grothendieck ggrothendieck at gmail.com
Mon Feb 6 03:52:33 CET 2006

```Try this.  It takes a vector of dates in any class that has
an as.Date method and returns a vector of Date class whose
add m months to each element where m may be negative.
Internally it makes use of the yearmon class and methods
in the zoo library; however, as shown in the examples
its simple to convert to class timeDate.  The way it
works is to calculate the date m months hence at the
beginning of the month + day - 1 and the end of the month
and it takes whichever is smaller.

library(zoo)
addmon <- function(x = Sys.Date(), m = 1) {
dd <- as.Date(x)
ym <- as.yearmon(dd)
pmin(as.Date(ym + m/12) + as.numeric(format(dd, "%d")) - 1,
as.Date(ym + m/12, frac = 1))
}

# test
charvec <- c("2005-12-25", "2006-01-30")

library(fCalendar)

On 2/5/06, Wojciech Slusarski <wojciech.slusarski at gmail.com> wrote:
> Well, thanks for the help, but not exactly. The function I would like to
> have would give results for starting dates
>
> charvec = c("2005-12-25", "2006-01-30")
>
> >function_name(charvec,+1M)
>
> [1] [2006-01-25] [2006-02-28]
>
> So it's adding one month to a date, but when it exceeds the last day of the
> next month, it gives the las day.
>
> The other way could be also useful:
>
> charvec = c("2005-12-25", "2006-02-28")
>
> >function_name(charvec,-1M)
>
> [1] [2005-11-25] [2006-01-31]
> #first date was decreased by one month, the second was decreased to the last
> day of january (not 28th January).
>
> Having such functions, one could set up proper dates for tenors in discount
> curve. In the function you published few days ago, you setup fixed year
> fractions for each tenor, which don't take into account holidays etc.
>
> Best regards,
> Wojtek
>
> 2006/2/5, Diethelm Wuertz <wuertz at itp.phys.ethz.ch>:
> >
> >
> > Here comes a function which computes  time and date for the last Day
> > It is Rmetrics conform and preserves time zone, daylight saving and
> > Financial Centers.
> >
> > Is that what you wanted?
> >
> > DW
> >
> >
> >
> > function(charvec, month, format = "%Y-%m-%d", FinCenter = "GMT")
> > {
> >    if (Sys.getenv("TZ")[[1]] != "GMT") warning("Set timezone to GMT!")
> >    if (FinCenter == "") FinCenter = "GMT"
> >    if (month < 0) stop("month must be positive")
> >    date = timeLastDayInMonth(charvec, format = format, FinCenter =
> > FinCenter)
> >    for (i in 1:month) date = timeLastDayInMonth(date, format = format,
> >        FinCenter = FinCenter) + 3600*24
> >
> >    # Return Value:
> >    timeLastDayInMonth(date, format = format, FinCenter = FinCenter)
> > }
> >
> > # Example:
> > > timeLastDayNMonthAhead(c("2005-12-25", "2006-02-28"), month = 2)
> > [1] "GMT"
> > [1] [2006-02-28] [2006-04-30]
> >
> >
> >
> >
> >
> > Wojciech Slusarski wrote:
> >
> > >I thought a bit about the function below, and see a problem, when n<0 (I
> > >would like to decrease the date.s by one month). I still have no Idea how
> > to
> > >implement it.
> > >
> > >Best regards,
> > >Wojtek
> > >
> > >
> > >2006/2/5, Wojciech Slusarski <wojciech.slusarski at gmail.com>:
> > >
> > >
> > >>Well,
> > >>
> > >>Thanks for the help, but I thought about something more general, that
> > >>could allow me adding n months to a date. I am sorry, that my question
> > >>wasn't so clear. If someone needed, here's the code:
> > >>
> > >>
> > >>EMONTH =
> > >>function(date.s, n)
> > >>{
> > >>  #function adds 'n' months to 'date.s'
> > >>  dates = timeSequence(from = format(date.s at Data, "%Y-%m-%d"),
> > length.out= n+1, by = "month")
> > >>  if(atoms(date.s)[1,"d"]>28)
> > >>  {
> > >>      if(atoms(dates)[n+1,"d"]<4)
> > >>   {
> > >>      emonth = dates[n+1]-atoms(dates)[n+1,"d"]*24*3600
> > >>   } else {
> > >>     emonth = dates[n+1]
> > >>   }
> > >>  } else {
> > >>    emonth = dates[n+1]
> > >>  }
> > >>  emonth
> > >>}
> > >>
> > >>
> > >>
> > >># test
> > >>
> > >>date.s = timeDate("2005-12-30")
> > >>
> > >>
> > >>
> > >>>EMONTH(date.s, 2)@Data
> > >>>
> > >>>
> > >>[1] "2006-02-28"
> > >>Best regards,
> > >>Wojtek
> > >>
> > >>
> > >>2006/2/5, Diethelm Wuertz <wuertz at itp.phys.ethz.ch>:
> > >>
> > >>
> > >>>Gabor Grothendieck wrote:
> > >>>
> > >>>
> > >>>
> > >>>>Try this:
> > >>>>
> > >>>>library(fCalendar)
> > >>>>dates <- timeSequence(from = "2005-12-1", to = "2006-12-1", format =
> > >>>>"%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw")
> > >>>>dates <- timeLastDayInMonth(dates)
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>Alternatively you can use
> > >>>
> > >>>
> > >>>
> > >>>>timeSequence(from = "2006-01-01", to = "2007-01-01", format =
> > >>>>
> > >>>>
> > >>>+ "%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw") - 3600*24
> > >>>[1] "Europe/Warsaw"
> > >>>[1] [2005-12-31] [2006-01-31] [2006-02-28] [2006-03-31] [2006-04-30]
> > >>>[6] [2006-05-31] [2006-06-30] [2006-07-31] [2006-08-31] [2006-09-30]
> > >>>[11] [2006-10-31] [2006-11-30] [2006-12-31]
> > >>>
> > >>>Please use proper ISO-8601 notation: 2006-01-05 and not 2006-1-5 !
> > >>>
> > >>>DW
> > >>>
> > >>>
> > >>>
> > >>>>On 2/4/06, Wojciech Slusarski < wojciech.slusarski at gmail.com> wrote:
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>>>Dear R users,
> > >>>>>
> > >>>>>Could anyone help me with creating a monthly series of dates?
> > >>>>>When I try to do:
> > >>>>>
> > >>>>>dates = timeSequence(from = "2005-12-31", to = "2006-12-31", format =
> > >>>>>"%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw")
> > >>>>>
> > >>>>>I get:
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>>dates
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>[1] "Europe/Warsaw"
> > >>>>>[1] [2005-12-31] [2006-01-31] [2006-03-03] [2006-03-31] [2006-05-01]
> > >>>>>[6] [2006-05-31] [2006-07-01] [2006-07-31] [2006-08-31] [2006-10-01]
> > >>>>>[11] [2006-10-31] [2006-12-01] [2006-12-31]
> > >>>>>
> > >>>>>Unfourtunately, I would like to heave end of month at each point.
> > >>>>>I thought, that maybe using this function would also help when trying
> > >>>>>
> > >>>>>
> > >>>
> > >>>
> > >>>>>a month to a date. I would like to have
> > >>>>>
> > >>>>>"2006-01-31" + 1M = "2006-02-28"
> > >>>>>
> > >>>>>in MS EXCEL I would use EDATE("2006-01-31";1), and that would work. I
> > >>>>>couldn't find any similar function in R for that. Am I missing some
> > >>>>>function?
> > >>>>>
> > >>>>>Best regards,
> > >>>>>Wojtek
> > >>>>>
> > >>>>>      [[alternative HTML version deleted]]
> > >>>>>
> > >>>>>_______________________________________________
> > >>>>>R-sig-finance at stat.math.ethz.ch mailing list
> > >>>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>_______________________________________________
> > >>>>R-sig-finance at stat.math.ethz.ch mailing list
> > >>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>>
> > >>>_______________________________________________
> > >>>R-sig-finance at stat.math.ethz.ch mailing list
> > >>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> > >>>
> > >>>
> > >>>
> > >>
> > >>
> > >
> > >       [[alternative HTML version deleted]]
> > >
> > >_______________________________________________
> > >R-sig-finance at stat.math.ethz.ch mailing list
> > >https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> > >
> > >
> > >
> >
> >
>
>        [[alternative HTML version deleted]]
>
> _______________________________________________
> R-sig-finance at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>

```