[R] previous monday date

Marc Schwartz marc_schwartz at me.com
Fri Sep 2 17:59:37 CEST 2011


On Sep 2, 2011, at 10:35 AM, Ben qant wrote:

> Hello,
> 
> I'm attempting to return the date (in form '%Y-%m-%d') of the Monday
> previous to the current date. For example: since it is 2011-09-02 today, I
> would expect 2011-08-29 to be the return value.
> 
> I found the following in:
> http://www.mail-archive.com/r-help@r-project.org/msg144184.html
> 
> Start quote from link:
> prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4)
> 
> For example,
> 
>> prevmonday(Sys.Date())
> [1] "2011-08-15"
>> prevmonday(prevmonday(Sys.Date()))
> [1] "2011-08-15"
> 
> End quote from link.
> 
> But when I do it I get:
>> prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4)
>> prevmonday(Sys.Date())
> Error in as.Date.numeric(1 - 4) : 'origin' must be supplied
> 
> I've tried setting the 'origin' argument in as.Date() in different ways, but
> it returns inaccurate results.
> 
> Thanks,
> 
> Ben


If memory serves, this is because Gabor used the version of as.Date() from his 'zoo' package in that post, which does not require an origin to be specified, whereas the default as.Date() function in R's base package does:

prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4)

> prevmonday(Sys.Date())
Error in as.Date.numeric(1 - 4) : 'origin' must be supplied

> require(zoo)
Loading required package: zoo

Attaching package: 'zoo'

The following object(s) are masked from 'package:base':

    as.Date

> prevmonday(Sys.Date())
[1] "2011-08-29"


# Remove 'zoo' to use the base function
detach(package:zoo)

> prevmonday(Sys.Date())
Error in as.Date.numeric(1 - 4) : 'origin' must be supplied


# Fix the function to use base::as.Date()
prevmonday <- function(x) 7 * floor(as.numeric(x-1+4) / 7) + as.Date(1-4, origin = "1970-01-01")

> prevmonday(Sys.Date())
[1] "2011-08-29"


See ?as.Date

HTH,

Marc Schwartz



More information about the R-help mailing list