[R] manipulating the Date & Time classes

Phil Spector spector at stat.berkeley.edu
Tue Feb 8 22:58:26 CET 2011


Mike -
    apply turns its argument into an array (in this case a 
matrix), which can't accomodate dates.  To operate on the
rows of a data frame, your best bet is probably to use a 
for loop.  There's no reason to dread loops in R -- just try 
to avoid growing objects inside a loop by preallocating space 
for the result.
                                             - Phil



On Tue, 8 Feb 2011, Mike Williamson wrote:

> Phil,
> 
>     Thanks!  I am not sure why min & max sometimes work & other times don't
> work.  In fact, running the script as you had it did work for me.  For arrays
> that I had, it wasn't working and still isn't.  For the moment, I won't worry
> about it.  It seems maybe it is a hidden bug somewhere (or I am making an
> error), instead of just a simple feature to add.
>     Regarding switching back to POSIXct, I wasn't aware of that method to
> switch back.  That will save a big headache, and I'm glad I asked!!
> 
>     As long as you have so many great ideas, do you know how to handle times
> / dates when using "apply"?  When I use "apply", it forces the times into
> characters.  E.g.:
> 
> tmp:
>             Col A             Col B
> 1  2010-12-14 00:47:25 2010-12-14 20:25:40
> 2  2010-12-14 13:03:04 2010-12-14 20:25:45
> 3  2010-12-14 13:13:06 2010-12-14 20:25:41
> 4  2010-12-11 16:33:59 2010-12-14 20:25:41
> 5  2010-12-14 07:32:50 2010-12-14 20:25:41
> 6  2010-12-14 07:36:21 2010-12-14 20:25:45
> 7  2010-10-11 09:31:37 2010-12-01 14:21:42
> 8  2010-09-25 19:09:34 2010-09-25 21:10:50
> 9  2010-12-14 17:53:25 2010-12-14 20:33:49
> 10 2010-09-30 16:43:40 2010-12-01 15:36:07
> 
>     If I perform:
>  *  sapply(tmp, class) or lapply(tmp, class)
>     I get:
> [1,] "POSIXt"    "POSIXt"   
> [2,] "POSIXct"   "POSIXct"  
> 
>     But if I perform:
>  *  apply(tmp, 1, class)
>     I get:
>  [1] "character" "character" "character" "character" "character" "character"
>  [7] "character" "character" "character" "character"
> 
>     So I cannot perform any operations on times by row, unless I touch the
> dreaded "for loop".  Or unless there is a secret I do not know...
> 
>                                                               Thanks!
>                                                                    Mike
> 
> 
> 
> "Telescopes and bathyscaphes and sonar probes of Scottish lakes,
> Tacoma Narrows bridge collapse explained with abstract phase-space maps,
> Some x-ray slides, a music score, Minard's Napoleanic war:
> The most exciting frontier is charting what's already here."
>   -- xkcd
> 
> --
> Help protect Wikipedia. Donate now:
> http://wikimediafoundation.org/wiki/Support_Wikipedia/en
> 
> 
> On Tue, Feb 8, 2011 at 12:31 PM, Phil Spector <spector at stat.berkeley.edu>
> wrote:
>       Mike -
>         In what sense do min and max not work?
>
>             tm = as.POSIXct(c("2010-12-14 20:25:40","2010-12-10
>             08:15:20","2010-10-05 05:12:10"))
>             min(tm)
>
>       [1] "2010-10-05 05:12:10 PDT"
>             max(tm)
>
>       [1] "2010-12-14 20:25:40 PST"
>
>       When a POSIX time becomes numeric, try something like this:
>
>             untm = as.numeric(tm)
>             untm
>
>       [1] 1292387140 1291997720 1286280730
>             class(untm) = 'POSIXct'
>             untm
>
>       [1] "2010-12-14 20:25:40 PST" "2010-12-10 08:15:20 PST"
>       [3] "2010-10-05 05:12:10 PDT"
>
>       That is, just force the class back to POSIXct, don't use
>       as.POSIXct.
>
>       Hope this helps.
>                                              - Phil Spector
>                                               Statistical Computing
>       Facility
>                                               Department of Statistics
>                                               UC Berkeley
>                                               spector at stat.berkeley.edu
> 
>
>       On Tue, 8 Feb 2011, Mike Williamson wrote:
>
>       Hello,
>
>         This is mostly to developers, but in case I missed
>       something in my
>       literature search, I am sending this to the broader
>       audience.
> 
>
>        - Are there any plans in the works to make "time" classes
>       a bit more
>        friendly to the rest of the "R" world?  I am not
>       suggesting to allow for
>        fancy functions to manipulate times, per se, or to figure
>       out how to
>        properly "add" times or anything complicated.  Just some
>       fixes to make it
>        easier to work with the "time" classes.  Here is a
>       sampling of some strange
>        bugs with the time classes that, to my knowledge, don't
>       exist with any other
>        core classes:
>     1. you cannot "unlist" a time without losing the class.
>  E.g., if you
>     unlist "2010-12-14 20:25:40" (POSIXct), you get "1292387141",
> at
> least on my
>     OS & with my time zone.  Regardless of the exact number,
> unlisting a time
>     class converts it to a numeric.
>        - upon converting to a numeric, it seems there is an
> underlying,
>        assumed origin of "1970-01-01 00:00:00".  However, this
> same
> assumption does
>        not underlie the conversion *back* to a POSIX time, e.g.,
> through
>        as.POSIXct() function.  Therefore, whenever a time is
> "accidentally"
>        converted to a numeric, I have to force it back to a time
> through
>        as.POSIXct(), *providing my own details* as to the origin.
>  There
>        is no easy way to find the underlying origin.  This makes
> me
> nervous for any
>        persistent functions I create.  If the underlying origin
> ever
> changes, then
>        all this code will be inaccurate.  Maybe the origin will
> never change, but
>        regardless it makes more sense to allow for the same
> underlying origin
>        default for "as.POSIXct" that is used when unlisting, or
> similar activities
>        that force the time into a numeric.
>        2. you cannot perform functions that otherwise seem
> trivial, such
>     as a "max" or "min".  I understand why, for instance, adding
> is
> hard.  But
>     what about max or min?  Greater than or less than are
> possible, as is
>     order().  I have my own simple scripts using these 2
> functions
> in order to
>     create a "max" & "min" for times, but it would be nice to
> have something
>     vetted & official.
> 
>   If others could chime in with any strange behaviors they've
> seen in
> working with times, maybe we could get a critical mass of issues
> that are
> worthy of an overhaul.
> 
>                                         Thanks & Regards,
>                                                   Mike
> 
> 
> "Telescopes and bathyscaphes and sonar probes of Scottish lakes,
> Tacoma Narrows bridge collapse explained with abstract
> phase-space maps,
> Some x-ray slides, a music score, Minard's Napoleanic war:
> The most exciting frontier is charting what's already here."
>  -- xkcd
> 
> --
> Help protect Wikipedia. Donate now:
> http://wikimediafoundation.org/wiki/Support_Wikipedia/en
> 
>        [[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible
> code.
> 
> 
> 
>


More information about the R-help mailing list