Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling dates when we switch to daylight savings time and back

I would like to use R for time series analysis. I want to make a time-series model and use functions from the packages timeDate and forecast.

I have intraday data in the CET time zone (15 minutes data, 4 data points per hour). On March 31st daylight savings time is implemented and I am missing 4 data points of the 96 that I usually have. On October 28th I have 4 data points too many as time is switched back.

For my time series model I always need 96 data points, as otherwise the intraday seasonality gets messed up.

Do you have any experiences with this? Do you know an R function or a package that would be of help to automat such data handling - something elegant? Thank you!

like image 547
Richi W Avatar asked Dec 13 '12 17:12

Richi W


People also ask

What happens when we switch to Daylight Savings Time?

Daylight Saving Time (DST) is the practice of moving the clocks forward one hour from Standard Time during the summer months and changing them back again in the fall.

When did we start switching to daylight savings time?

The plan was not formally adopted in the U.S. until 1918. 'An Act to preserve daylight and provide standard time for the United States' was enacted on March 19, 1918. [See law]It both established standard time zones and set summer DST to begin on March 31, 1918.

How many days does it take to adjust to daylight savings?

It can take the body up to a week or more to adjust. Until then, falling asleep and waking up later can be harder. If you are getting seven to eight hours of sound sleep and go to bed a little early the night before, you may wake up feeling refreshed.


2 Answers

I had a similar problem with hydrological data from a sensor. My timestamps were in UTC+1 (CET) and did not switch to daylight saving time (UTC+2, CEST). As I didn't want my data to be one hour off (which would be the case if UTC were used) I took the %z conversion specification of strptime. In ?strptime you'll find:

%z Signed offset in hours and minutes from UTC, so -0800 is 8 hours behind UTC.

For example: In 2012, the switch from Standard Time to DST occured on 2012-03-25, so there is no 02:00 on this day. If you try to convert "2012-03-25 02:00:00" to a POSIXct-Object,

> as.POSIXct("2012-03-25 02:00:00", tz="Europe/Vienna")
[1] "2012-03-25 CET"

you don't get an error or a warning, you just get date without the time (this behavior is documented).

Using format = "%z" gives the desired result:

> as.POSIXct("2012-03-25 02:00:00 +0100", format="%F %T %z", tz="Europe/Vienna")
[1] "2012-03-25 03:00:00 CEST"

In order to facilitate this import, I wrote a small function with appropriate defaults values:

as.POSIXct.no.dst <- function (x, tz = "", format="%Y-%m-%d %H:%M", offset="+0100", ...)
{
  x <- paste(x, offset)
  format <- paste(format, "%z")
  as.POSIXct(x, tz, format=format, ...)
}

> as.POSIXct.no.dst(c("2012-03-25 00:00", "2012-03-25 01:00", "2012-03-25 02:00", "2012-03-25 03:00"))
[1] "2012-03-25 00:00:00 CET"  "2012-03-25 01:00:00 CET"  "2012-03-25 03:00:00 CEST"
[4] "2012-03-25 04:00:00 CEST"
like image 178
Tobias Avatar answered Sep 18 '22 12:09

Tobias


If you don't want daylight saving time, convert to a timezone that doesn't have it (e.g. GMT, UTC).

times <- .POSIXct(times, tz="GMT")
like image 39
Joshua Ulrich Avatar answered Sep 17 '22 12:09

Joshua Ulrich