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

Enrico Schumann es at enricoschumann.net
Thu Sep 8 15:41:44 CEST 2016


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


Kind regards
     Enrico

> Thanks again for your time, ideas and help!
>
> Best,
> Vero
>
> 2016-09-08 8:20 GMT-03:00 Luisfo <luisfo89 at yahoo.es>:
>
>     Dear Veronica,
>    
>     Here there's a way of doing what you requested.
>    
>     library("lubridate")
>     # your date '2010-08-21' as Date object
>     dd <- as.Date(strptime("2010-08-21", format="%Y-%m-%d", tz="GMT"))
>     # take the first day of the year as Date object, i.e. 2010-01-01 in our example
>     ref.date <- as.Date(strptime(paste0(year(dd),"-01-01"), format="%Y-%m-%d", tz="GMT"))
>     # the start and end dates
>     bound.dates <- ref.date + 7 * (week(dd)-1) + c(0,6)
>    
>     I hope you find it useful.
>    
>     Best,
>    
>     Luisfo Chiroque
>     PhD Student | PhD Candidate
>     IMDEA Networks Institute
>     http://fourier.networks.imdea.org/people/~luis_nunez/
>    
>     On 09/08/2016 12:13 PM, Veronica Andreo wrote:
>    
>         Hello list,
>         
>         Is there a quick way to get start and end date (%Y-%m-%d) from ISO
>         weeks if I only have dates?
>         
>         For example, I have this date in which some event happened:
>         "2010-08-21". Not only I want the ISO week, which I can obtain either
>         with isoweek (lubridate) or ISOweek (ISOweek), but I want the start
>         and end date of that ISO week.
>         
>         Do I need to print all ISO weeks from the period of interest and
>         sample there for start and end date? Or is there a better way to do
>         that?
>         
>         Thanks a lot in advance!
>         
>         Best,
>         Veronica
>

-- 
Enrico Schumann
Lucerne, Switzerland
http://enricoschumann.net



More information about the R-help mailing list