Frank S.
2016-Sep-30 16:38 UTC
[R] Elegant way to get specific dates within prespecified period
Dear R users, I have two dates, ["open", "close"], which can be any dates such "close" is strictly later than "open". I wanted to write an R code that displays the following: To construct a vector "v" with all 1st January days located between "open" and "close" dates: v = (dp_1, dp_2, ..., dp_n). Moreover: a) Regard to the first date "dp_1": a1) If "open" is on a 1st January day, "dp_1" is on 1st January of the year after "open". a2) In case difftime between "open" and the following 1st January is lower than 30 days, "dp_1" will be on 1st January of the year after the year of that 1st January. b) Regard to the last date "dp_n": b1) If "close" is on a 1st January day, dp_n is on 1st January of the year before "close" b2) In case difftime between "close" and the previous 1st January is lower than 30 days, "dp_n" will be on 1st January of the year before the year of that 1st January. Example 1: [open = 2007-01-01, close = 2011-04-05] v = (2008-01-01, 2009-01-01, 2010-01-01, 2011-01-01) # Since open is already on a 1st January # Since difftime(2011-04-05, 2011-01-01) >= 30 days Example 2: [open = 2006-12-15, close = 2011-01-19] v = (2008-01-01, 2009-01-01, 2010-01-01) # Since difftime(2007-01-01, 2006-12-15) < 30 days # Since difftime(2011-01-19, 2011-01-01) < 30 days My code is (for example 2): open <- as.Date('2006-12-15') close <- as.Date('2011-01-19') dp_1 <- as.Date(ifelse( as.Date(paste(as.character(as.numeric(format(open, "%Y")) + 1), 1, 1, sep = "-")) - open >= 30, as.Date(paste(as.character(as.numeric(format(open, "%Y")) + 1), 1, 1, sep = "-")), as.Date(paste(as.character(as.numeric(format(open, "%Y")) + 2), 1, 1, sep = "-"))), origin = "1970-01-01") dp_n <- as.Date(ifelse( close - as.Date(paste(as.character(as.numeric(format(close, "%Y"))), 1, 1, sep = "-")) >= 30, as.Date(paste(as.character(as.numeric(format(close, "%Y"))), 1, 1, sep = "-")), as.Date(paste(as.character(as.numeric(format(close, "%Y")) - 1), 1, 1, sep = "-"))), origin = "1970-01-01") v <- seq(dp_1, dp_n, by = "year") However, above code is not too large, so I'm almost sure that there might be a better way of doing it. Is there a better way to get the vector "v"? Thanks for any help! Frank S. [[alternative HTML version deleted]]