baz
baz

Reputation: 7117

Calculating the number of weeks for each year based on dates using R

I have a dataset with dates of 2 different years (2009 and 2010) and would like to have the corresponding week number for each date.

My dataset is similar to this:

  anim <- c(012,023,045,098,067)
  dob <- c("01-09-2009","12-09-2009","22-09-2009","10-10-2010","28-10-2010")
  mydf <- data.frame(anim,dob)
  mydf
    anim    dob
1   12   01-09-2009
2   23   12-09-2009
3   45   22-09-2009
4   98   10-10-2010
5   67   28-10-2010

I would like to have variable "week" in the third column with the corresponding week numbers for each date.

EDIT: Note: Week one begins on January 1st, week two begins on January 8th for each year

Any help would be highly appreciated.

Baz

Upvotes: 0

Views: 1617

Answers (3)

RLP
RLP

Reputation: 41

If you want to do how many weeks (or 7 day periods) have passed between your date of interest and the first day of the year, regardless of what day of the week it was on the first of the year, the following is a solution (using floor_date from lubridate).

mydf$weeks <- difftime(mydf$dob, floor_date(mydf$dob, "year"), units = c("weeks")))

Upvotes: 0

Jeff Parker
Jeff Parker

Reputation: 1969

Post 2011 Answer

library(lubridate)
mydf$week <- week(mydf$week)

lubridate package is straight-forward for day-to-day tasks like this.

Upvotes: 0

Brian Diggs
Brian Diggs

Reputation: 58825

Your definition of "week of year"

EDIT: Note: Week one begins on January 1st, week two begins on January 8th for each year

differs from the standard ones supported by strftime:

%U
    Week of the year as decimal number (00–53) using Sunday as the first day 1 
    of the week (and typically with the first Sunday of the year as day 1 of 
    week 1). The US convention.
%W
    Week of the year as decimal number (00–53) using Monday as the first day 
    of week (and typically with the first Monday of the year as day 1 of week 
    1). The UK convention.

So you need to compute it based on the day-of-year number.

mydf$week <- (as.numeric(strftime(as.POSIXct(mydf$dob, 
                                             format="%d-%m-%Y"), 
                                  format="%j")) %/% 7) + 1

Upvotes: 3

Related Questions