[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