juhariis juhariis - 19 days ago 6
R Question

R strptime Monday date from weeknumber weird

I am making a trivial error here but cannot get my head around figuring out what is the problem.

I need to get the date of the Monday of the week of a random date.. Seems I am getting something quite different

mydate <- date("2013-11-05")

format(mydate, "%A") # this is Tuesday, right
#[1] "Tuesday"
month(mydate) # Month November, right
#[1] 11
myyr <- year(mydate); myyr # year is 2013, right
#[1] 2013
day(mydate) # day number is 5, right
#[1] 5
mywk <- isoweek(mydate);mywk # weeknumber is 45, right (yes, not US convention here)
#[1] 45
format(mydate, "%V") # weeknumber is 45, right as well
#[1] "45"
# Monday of week 45 is 2013-11-04 but strptime following gives something else...

strptime(paste0(myyr, "Monday", mywk), "%Y%A%V")
#[1] "2013-11-19 EET"
# and for checking

strptime("2013Monday45","%Y%A%V")
#[1] "2013-11-19 EET"


Thanks in advance

Answer

Gabor's comment is all you need, essentially. Here is a full function:

mondayForGivenDate <- function(d) { 
    if (class(d) != "Date") d <- anytime::anydate(d)
    d - as.POSIXlt(d)$wday + 1
}

Running this for today (a Saturday), next Monday and previous Saturday gets us three different Monday's as you expect:

R> mondayForGivenDate(Sys.Date())
[1] "2016-11-14"
R> mondayForGivenDate(Sys.Date()+2)
[1] "2016-11-21"
R> mondayForGivenDate(Sys.Date()-7)
[1] "2016-11-07"
R> 

The use of the anydate() function from the anytime is optional but nice because you now get to use many different input formats:

R> mondayForGivenDate(20161119)
[1] "2016-11-14"
R> mondayForGivenDate("20161119")
[1] "2016-11-14"
R> mondayForGivenDate("2016-11-19")
[1] "2016-11-14"
R> mondayForGivenDate("2016-Nov-19")
[1] "2016-11-14"
R> 

The key point, once again, is to work with the proper Date and/or POSIXt classes in R which almost always give you what is needed -- in this case the wday component for the day of the week need to revert back to the week's Monday.