[R] Subtract days to dates in POSIXct format

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Mon Apr 30 17:51:31 CEST 2012


On Mon, 30 Apr 2012, Santiago Guallar wrote:

> Hello,
>
> I'm having problems working with date values in POSIXct format.

Indeed you are.

> Here is what I got (eg.lig attached):
>
> x <- read.table("eg.txt", sep = ',', col.names=c("ok","time","secs","lig")) # it gives time as factor
> z <- cbind(x,colsplit(x$time, split="\\s", names=c("date", "clock")))

colsplit is not defined in base R, and it is redefined in a couple of 
packages.  I am guessing you mean the one that is in the reshape package.

> zh<-cbind(z,colsplit(z$clock,split=":",names=c("h","m","s")))
> zn <- subset(zh, zh$lig<= 5 & zh$h<8 | zh$h>=22) # nighttime
> zn$timepos<-as.POSIXct(zn$time,tz="GMT",format="%d/%m/%y %H:%M:%S")

> I want to assign timepos to its ?natural? night, that is, the night that 
> goes from sunset of day x to sunrise of day x+1 corresponds to day x:

You are working here with GMT, but there are many other possible timezones 
that this data could correspond to, and if the input time really is in 
GMT, then the interval of night could be anytime.

>
> zn$night<-ifelse(zn$h>=0 & zn$h<9,zn$timepos ??oneday?,zn$timepos)  #doesn?t work
>
> How can I subtract one day (24 hours) to zn$timepos and obtain a POSIXct output?

Well, a literal answer to your question is:

zn$timepos - as.difftime( 1, units="days" )

but in response to your stated goal perhaps you should study the 
following:

library(maptools)
Sys.setenv( TZ="GMT" ) # set to the local timezone for column "time"
dta <- read.table( "eg.txt"
                  , sep=','
                  , col.names=c("ok","time","secs","lig")
                  , stringsAsFactors=FALSE)
dta$dtm <- as.POSIXct( dta$time, format="%d/%m/%y %T" ) # depends on TZ
# site is invented in GMT timezone for illustration
site <- SpatialPoints( matrix( 0, 51.5, nrow=1 )
                      , proj4string=CRS("+proj=longlat +datum=WGS84" ) )
dta$rise <- sunriset( site
                     , dta$dtm
                     , direction="sunrise"
                     , POSIXct.out=TRUE )$time
dta$set <- sunriset( site
                    , dta$dtm
                    , direction="sunset"
                    , POSIXct.out=TRUE )$time
dta$isnight <- with( dta, !( rise < dtm & dtm < set ) )


---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
---------------------------------------------------------------------------


More information about the R-help mailing list