From ggrothendieck at gmail.com  Sat Sep 15 01:39:13 2007
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Fri, 14 Sep 2007 19:39:13 -0400
Subject: [Rd] Date vs date
In-Reply-To: <200709141722.l8EHMHF02634@hsrnfs-101.mayo.edu>
References: <200709141722.l8EHMHF02634@hsrnfs-101.mayo.edu>
Message-ID: <971536df0709141639y304adbd3h65765cf9c362be28@mail.gmail.com>

On 9/14/07, Terry Therneau <therneau at mayo.edu> wrote:
>  I wrote the date package long ago, and it has been useful.  In my current task
> of reunifying the R (Tom Lumley) and Splus (me) code trees for survival, I'm
> removing the explicit dependence on 'date' objects from the expected survival
> routines so that they better integrate.   Comparison of 'date' to 'Date' has
> raised a couple of questions.
>
>  Clearly Date is more mature -- more options for conversion, better plotting,
> etc (a long list of etc).  I see three things where date is better.  Only the
> last of these really matters, and is the point on which I would like comment.
> (Well, actually I'd like to talk you all into a change, of course).
>
>  1. Since date uses 1/1/1960 as the base, and so does SAS, those of us who
> contantly pass files back and forth between those two packages have a slightly
> easier time.

There are some other programs that use 1/1/70.  See the R Help Desk article
in R News 4/1 that discusses a few origins.

>
>  2. as.date(10) works, as.Date(10) does not.  Sometimes I have done a
> manipluation that the date package does not understand, and I know that the
> result is still of the right type, but the package does not.  However, this is
> fairly rare and I can work around it. (It mostly occurs in processing the rate
> tables for expected survival).

You can define as.Date.numeric in your package and then it will work.  zoo
has done that.

library(zoo)
as.Date(10)

Some other things you can do:

today <- Sys.Date()
Epoch <- today - as.numeric(today)

Epoch + 10  # similar to as.Date(10)

>
>  3. temp <- as.Date('1990/1/1') - as.date('1953/2/5')
>     sqrt(temp)
>     Error in Math.difftime(temp3) : sqrtnot defined for "difftime" objects
>
>  Minor bug: no space before the word 'not'
>  Major: this shouldn't fail.
>
> People will do things with time intervals that you have not thought of.  Fitting
> a growth curve that uses a square root, for instance.  I firmly believe that the
> superior behavior in the face of something unexpected is to assume that the user
> knows what they are doing, and return a numeric.
>   I recognize that "assume the user knows what they are doing" is an anathema
> to the more zealous OO types, but in designing a class I have found that they
> often know more than me!
>
>   4. Variation on #3 above
>
> > (as.Date('2007-9-14') - as.Date('1953-3-10')) / 365.25
>  Time difference of 54.51335 days
>
>    No, I am not 54.5 days old.  Both hair color and knee creaking most
> definitely proclaim otherwise, I am sorry to say. Time difference / number
> should be a number.

Note that you can write:

x <- Sys.Date()
y <- x + 1
as.numeric(x-y)
as.numeric(x) - as.numeric(y)

>
>   5. This is only amusing.  Im not saying that as.Date should necessarily work,
> but the format is certainly not ambiguous.  (Not standard, but not ambiguous).
> Not important to fix, not something that date does any better.
>
> > as.Date('09Sep2007')
> Error in fromchar(x) : character string is not in a standard unambiguous format

as.Date("09Sep2007", "%d%b%Y")

>
>
>
>        Terry Therneau



[Rd] Date vs date
Gabor Grothendieck