Handling dates when we switch to daylight savings time and back

前端 未结 3 2073
没有蜡笔的小新
没有蜡笔的小新 2020-11-29 08:54

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

相关标签:
3条回答
  • 2020-11-29 09:10

    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")
    
    0 讨论(0)
  • 2020-11-29 09:22

    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"
    
    0 讨论(0)
  • 2020-11-29 09:29

    Here is getting the daylight savings time offset - e.g. Central Daylight Savings time

    > Sys.time()
    

    "2015-08-20 07:10:38 CDT" # I am at America/Chicago daylight time

    > as.POSIXct(as.character(Sys.time()), tz="America/Chicago")
    

    "2015-08-20 07:13:12 CDT"

    > as.POSIXct(as.character(Sys.time()), tz="UTC") - as.POSIXct(as.character(Sys.time()), tz="America/Chicago")
    

    Time difference of -5 hours

    > as.integer(as.POSIXct(as.character(Sys.time()), tz="UTC") - as.POSIXct(as.character(Sys.time()), tz="America/Chicago"))
    

    -5

    Some inspiration was from

    Converting time zones in R: tips, tricks and pitfalls

    0 讨论(0)
提交回复
热议问题