[R] get start and end date of ISO weeks giving a date as input

Veronica Andreo veroandreo at gmail.com
Fri Sep 9 14:29:50 CEST 2016


Hello Enrico,

2016-09-08 10:41 GMT-03:00 Enrico Schumann <es at enricoschumann.net>:

> Hi Veronica,
>
> please see inline.
>
> On Thu, 08 Sep 2016, Veronica Andreo <veroandreo at gmail.com> writes:
>
> > Hello Luisfo and Enrico,
> >
> > Thanks for your help! I've been testing both
> > solutions... results differ for the same date (I
> > changed both functions to use ISO8601). And I added
> > contiguous dates, to see how they handle the
> > start-end of the week.
> >
> > So, here the results:
> >
> > ### one example
> > d <- c("2010-08-21","2010-08-22","2010-08-23","2010-08-24")
> > iso_start_end <- function(d) {
> >   d <- as.Date(d)
> >   wday <- as.POSIXlt(d)$wday
> >   data.frame(date = d,
> >              week = format(d, "%V"),
> >              starts = d - wday + 1,
> >              ends = d + 7 - wday)
> > }
> > iso_start_end(d)
> >
> >         date week     starts       ends
> > 1 2010-08-21   33 2010-08-16 2010-08-22
> > 2 2010-08-22   33 2010-08-23 2010-08-29
> > 3 2010-08-23   34 2010-08-23 2010-08-29
> > 4 2010-08-24   34 2010-08-23 2010-08-29
>
> Yes, the second date makes no sense, and it happens
> because Sunday is 0 (and not 7). My bad. Here is
> a fixed version:
>
>   iso_start_end <- function(d) {
>       d <- as.Date(d)
>       wday <- as.POSIXlt(d)$wday
>       wday[wday == 0] <- 7
>       data.frame(date = d,
>                  week = format(d, "%V"),
>                  starts = d - wday + 1,
>                  ends = d + 7 - wday)
>   }
>
>
> > ### the other example:
> > dd <- as.Date(strptime('2010-08-21', format="%Y-%m-%d", tz="GMT"))
> > ref.date <- as.Date(strptime(paste0(year(dd),"-01-01"),
> format="%Y-%m-%d"))
> > bound.dates <- ref.date + 7 * (isoweek(dd)) + c(0,6)
> > bound.dates
> > [1] "2010-08-20" "2010-08-26"
>
> You can use the function "weekdays" to see check the
> results.
>
>   > weekdays(bound.dates)
>   [1] "Friday"   "Thursday"
>
> > So, researching a bit more and inspired by those
> > examples, I eventually came up with this solution
> > that seems to work fine... I share in case that any
> > other has a similar problem:
> >
> > # get ISOweek for my vector of dates
> > week_iso<-ISOweek(d)
> >
> > # vector with the format %Y-W%V-1 for start day of the ISO week
> > week_iso_day1 <- paste(week_iso,1, sep="-")
> >
> > #  vector with the format %Y-W%V-7 for end day of the ISO week
> > week_iso_day7 <- paste(week_iso, 7, sep="-")
> >
> > # use ISOweek2date
> > data.frame(date= d, week_iso = week_iso, start =
> ISOweek2date(week_iso_day1), end = ISOweek2date(week_iso_day7)
> >
> >         date week_iso      start        end
> > 1 2010-08-21 2010-W33 2010-08-16 2010-08-22
> > 2 2010-08-22 2010-W33 2010-08-16 2010-08-22
> > 3 2010-08-23 2010-W34 2010-08-23 2010-08-29
> > 4 2010-08-24 2010-W34 2010-08-23 2010-08-29
>
> The updated 'iso_start_end' gives the same result.
>
>           date week     starts       ends
>   1 2010-08-21   33 2010-08-16 2010-08-22
>   2 2010-08-22   33 2010-08-16 2010-08-22
>   3 2010-08-23   34 2010-08-23 2010-08-29
>   4 2010-08-24   34 2010-08-23 2010-08-29
>

Yes! Again, thanks for your time and help!

Best,
Vero

	[[alternative HTML version deleted]]



More information about the R-help mailing list