I have written a set of functions for POSIXt objects that I would like to offer for consideration for use in base R. They augment and extend existing functions. Briefly,

##   pretty.ct         function(x,specs=pretty.ct.specs)
##   round.ct          function(x, tstr='1 min' )
##   axis.ct           function(side,x,specs=NULL,...)
##   parse.timeint     function(dv)
##   parse.tstr        function(tstr)
##   pretty.ct.specs   default value for the 'specs' argument of pretty.ct()

pretty.ct() is a 'pretty' function for POSIXt objects. It implements my idea of what is pretty, which is dependent on the time scale, and with the default specs prefers hours in multiples of 3, 6, or 12, and days in multiples of 7 or 14.

round.ct() serves the same purpose as round.POSIXt(), but allows rounding to multiples of the time unit, i.e., '15 min' , '2 hours', and the like.

axis.ct() serves the same purpose as axis.POSIXct() but selects tick values and intervals using pretty.ct(). Surprisingly, axis.ct() is significantly faster than axis.POSIXct() when passed a long vector.

The two parse functions translate strings like '10 min' or '36 h' to other more useable forms. These are based on code found in an early version of seq.POSIXct(), written, I believe, by Prof. Ripley.

A few examples are below.

If there is interest, I can send the source code, and will write Rd files for them.

-Don

 hrs <- 3600
 dys <- 24*hrs

## ## time range 60 hours ## pretty.ct() chooses 3 hours as a pretty interval ## nhr <- 60
 t1 <- ISOdatetime(2002,6,14,0,0,0)+hrs*runif(5,0,nhr)
 pretty.ct(t1)
[1] "2002-06-15 03:00:00 PDT" "2002-06-15 06:00:00 PDT" "2002-06-15 09:00:00 PDT" "2002-06-15 12:00:00 PDT"
[5] "2002-06-15 15:00:00 PDT" "2002-06-15 18:00:00 PDT" "2002-06-15 21:00:00 PDT" "2002-06-16 00:00:00 PDT"
[9] "2002-06-16 03:00:00 PDT" "2002-06-16 06:00:00 PDT" "2002-06-16 09:00:00 PDT"


 t1 <- sort(t1)
 cbind(format(t1),format(round.ct(t1,'6 h')))
     [,1]                  [,2]
[1,] "2002-06-15 02:49:03" "2002-06-15 00:00:00"
[2,] "2002-06-15 04:40:25" "2002-06-15 06:00:00"
[3,] "2002-06-15 11:12:29" "2002-06-15 12:00:00"
[4,] "2002-06-15 14:47:43" "2002-06-15 12:00:00"
[5,] "2002-06-16 09:01:32" "2002-06-16 12:00:00"

##
## time range 65 days
## pretty.ct() chooses 1 week as a pretty interval
##
 ndy <- 65
 t2 <- ISOdatetime(2002,6,24,0,0,0)+ndy*dys*(0:5)/5
 pretty.ct(t2)
[1] "2002-06-23 PDT" "2002-06-30 PDT" "2002-07-07 PDT" "2002-07-14 PDT" "2002-07-21 PDT" "2002-07-28 PDT" "2002-08-04 PDT"
[8] "2002-08-11 PDT" "2002-08-18 PDT" "2002-08-25 PDT"
cbind(format(t2),format(round.ct(t2,'1 w')))
     [,1]         [,2]
[1,] "2002-06-24" "2002-06-23"
[2,] "2002-07-07" "2002-07-07"
[3,] "2002-07-20" "2002-07-21"
[4,] "2002-08-02" "2002-08-04"
[5,] "2002-08-15" "2002-08-18"
[6,] "2002-08-28" "2002-08-25"

##
## the parse functions
##
parse.tstr('36 h')
$secs
[1] 129600

$nunits
[1] 36

$units
[1] "hours"

$tstr
[1] "36 h"

parse.timeint('36 h')
[1] 129600


## ## speed comparison ##
t8 <- structure(sort(runif(100000,1017820800,2*1017820800)),class=c('POSIXt','POSIXct'))
plot(t8,1:100000,xaxt='n',pch=3)
system.time(axis.ct(1,t8))
[1] 0.65 0.02 0.69 0.00 0.00
system.time(axis.POSIXct(1,t8))
[1] 11.94 0.00 12.07 0.00 0.00

version
         _
platform sparc-sun-solaris2.7
arch     sparc
os       solaris2.7
system   sparc, solaris2.7
status
major    1
minor    7.1
year     2003
month    06
day      16
language R

--
--------------------------------------
Don MacQueen
Environmental Protection Department
Lawrence Livermore National Laboratory
Livermore, CA, USA

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-devel

Reply via email to