Thanks a lot, that works exactly the way I needed. Best regards, Wojtek 2006/2/6, Gabor Grothendieck : > > 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 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 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 : > > > > > > > > > > > > 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 : > > > > > > > > > > > > > > >>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@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 : > > > > >> > > > > >> > > > > >>>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@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@stat.math.ethz.ch mailing list > > > > >>>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance > > > > >>>>> > > > > >>>>> > > > > >>>>> > > > > >>>>> > > > > >>>>> > > > > >>>>_______________________________________________ > > > > >>>>R-sig-finance@stat.math.ethz.ch mailing list > > > > >>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance > > > > >>>> > > > > >>>> > > > > >>>> > > > > >>>> > > > > >>>> > > > > >>>_______________________________________________ > > > > >>>R-sig-finance@stat.math.ethz.ch mailing list > > > > >>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance > > > > >>> > > > > >>> > > > > >>> > > > > >> > > > > >> > > > > > > > > > > [[alternative HTML version deleted]] > > > > > > > > > >_______________________________________________ > > > > >R-sig-finance@stat.math.ethz.ch mailing list > > > > >https://stat.ethz.ch/mailman/listinfo/r-sig-finance > > > > > > > > > > > > > > > > > > > > > > > > > > > > > [[alternative HTML version deleted]] > > > > > > _______________________________________________ > > > R-sig-finance@stat.math.ethz.ch mailing list > > > https://stat.ethz.ch/mailman/listinfo/r-sig-finance > > > > > > [[alternative HTML version deleted]]