[R-sig-finance] Problems with monthly sequences

Gabor Grothendieck ggrothendieck at gmail.com
Mon Feb 6 06:38:01 CET 2006


I have made some minor tweaks to shorten the function:

library(zoo)
addmon <- function(x = Sys.Date(), m = 1) {
       dd <- as.Date(x)
       ym <- as.yearmon(dd) + m/12
       pmin(as.Date(ym) + as.POSIXlt(dd)$mday - 1, as.Date(ym, 1))
}

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

library(fCalendar)
timeDate(format(addmon(charvec)))


On 2/5/06, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:
> 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")
> addmon(charvec)
> addmon(charvec, -11)
>
> library(fCalendar)
> timeDate(format(addmon(charvec)))
>
>
> 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
> > > n-month ahead.
> > > It is Rmetrics conform and preserves time zone, daylight saving and
> > > Financial Centers.
> > >
> > > Is that what you wanted?
> > >
> > > DW
> > >
> > >
> > >
> > > timeLastDayNMonthAhead =
> > > 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
> > > >>>>>
> > > >>>>>
> > > >>>to add
> > > >>>
> > > >>>
> > > >>>>>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
> >
>



More information about the R-sig-finance mailing list