Ian Kennedy
2004-Apr-29 14:28 UTC
[R] Entering times around the start of daylight savings time
I'm having problems entering dates and times around when daylight savings time starts. If I type (on R 1.8.1 on Gentoo Linux)> ISOdatetime(2004,4,4,0:4,0,0,"GMT")[1] "2004-04-03 19:00:00 EST" "2004-04-03 20:00:00 EST" [3] "2004-04-03 22:00:00 EST" "2004-04-03 22:00:00 EST" [5] "2004-04-03 23:00:00 EST" Giving the times between 2:00 and 3:00 GMT on 4 April which are all off by one hour. I tried setting TZ (to "Canada/Eastern") but didn't see any change. For comparison I tried the same thing in R 1.8.1 for Windows and got a similar error, but the one hour that is wrong is one hour early, rather than one hour late:> ISOdatetime(2004,4,4,0:4,0,0,"GMT")[1] "2004-04-03 19:00:00 Eastern Standard Time" [2] "2004-04-03 20:00:00 Eastern Standard Time" [3] "2004-04-03 20:00:00 Eastern Standard Time" [4] "2004-04-03 22:00:00 Eastern Standard Time" [5] "2004-04-03 23:00:00 Eastern Standard Time" If I try the same thing on R 1.9 for OS X, I get the correct result, that is one hour intervals. So far I've been able to enter times correctly for this period by using chron, multiplying by the number of seconds in a day and forcing the resulting number to be a POSIXct, but this seems too involved and probably unreliable. Thanks for any suggestions, Ian Kennedy
Don MacQueen
2004-Apr-29 15:30 UTC
[R] Entering times around the start of daylight savings time
You might do better using seq.POSIXt. Your basic problem is that your sequence includes a time that doesn't exist, 02:00 on the transition day. seq.POSIXt(ISOdatetime(2004,4,4,0,0,0),by='hour',len=5) [1] "2004-04-04 00:00:00 PST" "2004-04-04 01:00:00 PST" "2004-04-04 03:00:00 PDT" "2004-04-04 04:00:00 PDT" "2004-04-04 05:00:00 PDT" seq.POSIXt(ISOdatetime(2004,4,4,0,0,0,'GMT'),by='hour',len=5) [1] "2004-04-03 16:00:00 PST" "2004-04-03 17:00:00 PST" "2004-04-03 18:00:00 PST" "2004-04-03 19:00:00 PST" "2004-04-03 20:00:00 PST" Both of the above examples give answers that are correct for my timezone, and are the same on both an OS X system and a Solaris system. R 1.8.1. Note that they are in fact one hour apart:> diff(seq.POSIXt(ISOdatetime(2004,4,4,0,0,0,'GMT'),by='hour',len=5))Time differences of 1, 1, 1, 1 hours> diff(seq.POSIXt(ISOdatetime(2004,4,4,0,0,0),by='hour',len=5))Time differences of 1, 1, 1, 1 hours> diff(as.numeric(seq.POSIXt(ISOdatetime(2004,4,4,0,0,0),by='hour',len=5)))[1] 3600 3600 3600 3600> >diff(as.numeric(seq.POSIXt(ISOdatetime(2004,4,4,0,0,0,'GMT'),by='hour',len=5)))[1] 3600 3600 3600 3600 Also, since I'm in US pacific and you're in US eastern, perhaps this example will come closer to yours:> seq.POSIXt(ISOdatetime(2004,4,4,8,0,0,'GMT'),by='hour',len=5)[1] "2004-04-04 00:00:00 PST" "2004-04-04 01:00:00 PST" "2004-04-04 03:00:00 PDT" "2004-04-04 04:00:00 PDT" "2004-04-04 05:00:00 PDT" Again, note that it correctly makes the PST to PDT transition, giving times that are one hour apart.> >diff(as.numeric(seq.POSIXt(ISOdatetime(2004,4,4,8,0,0,'GMT'),by='hour',len=5)))[1] 3600 3600 3600 3600 Whatever the timezone, if the change from standard time to daylight savings time takes place at 02:00, then there are no "times between 2:00 and 3:00". That is, the correct sequence of times is 01:58, 01:59, 03:00, 03:01, etc., because at 2 AM we jump directly to 3 AM (that's what daylight savings time is, after all). seq.POSIXt(ISOdatetime(2004,4,4,1,58,0),by='min',len=5) [1] "2004-04-04 01:58:00 PST" "2004-04-04 01:59:00 PST" "2004-04-04 03:00:00 PDT" "2004-04-04 03:01:00 PDT" "2004-04-04 03:02:00 PDT" When I first encountered this issue a while back, the advice was that if you specify times that don't exist (such as 02:00 on the transition day), what happens depends on your OS; and one should not expect it to make sense because in fact the time doesn't exist. A final note, in my OS X system, I get> ISOdatetime(2004,4,4,0:4,0,0)[1] "2004-04-04 00:00:00 PST" "2004-04-04 01:00:00 PST" NA "2004-04-04 03:00:00 PDT" "2004-04-04 04:00:00 PDT" I would consider this correct, since it gives NA for ISOdatetime(2004,4,4,2,0,0), a time that doesn't exist. Excluding the NA, it results in one hour intervals. -Don At 10:28 AM -0400 4/29/04, Ian Kennedy wrote:>I'm having problems entering dates and times around when daylight savings time >starts. If I type (on R 1.8.1 on Gentoo Linux) > >> ISOdatetime(2004,4,4,0:4,0,0,"GMT") >[1] "2004-04-03 19:00:00 EST" "2004-04-03 20:00:00 EST" >[3] "2004-04-03 22:00:00 EST" "2004-04-03 22:00:00 EST" >[5] "2004-04-03 23:00:00 EST" > >Giving the times between 2:00 and 3:00 GMT on 4 April which are all off by one >hour. I tried setting TZ (to "Canada/Eastern") but didn't see any change. > >For comparison I tried the same thing in R 1.8.1 for Windows and got a similar >error, but the one hour that is wrong is one hour early, rather than one hour >late: > > ISOdatetime(2004,4,4,0:4,0,0,"GMT") >[1] "2004-04-03 19:00:00 Eastern Standard Time" >[2] "2004-04-03 20:00:00 Eastern Standard Time" >[3] "2004-04-03 20:00:00 Eastern Standard Time" >[4] "2004-04-03 22:00:00 Eastern Standard Time" >[5] "2004-04-03 23:00:00 Eastern Standard Time" > >If I try the same thing on R 1.9 for OS X, I get the correct result, that is >one hour intervals. > >So far I've been able to enter times correctly for this period by using chron, >multiplying by the number of seconds in a day and forcing the resulting >number to be a POSIXct, but this seems too involved and probably unreliable. > >Thanks for any suggestions, > >Ian Kennedy > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://www.stat.math.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html-- -------------------------------------- Don MacQueen Environmental Protection Department Lawrence Livermore National Laboratory Livermore, CA, USA