Search code examples
rdatedatetimesapplystrftime

Extracting date and hour from Posixct object with strftime


I was trying to extract date and hour from a date time column using strftime but I don't understand why the values returned are 1 hour previous than the values that should be returned. For example for a date time of 2013-01-01 00:00:00 the values returned should be 2013-01-01 00 but instead what I'm getting is 2012-12-31 23. I also tried adding 1 hour and then extracting but over a long sequence of dates, it is again disturbing the output. Please see this sample code for reference.

## creating the sequence of time steps for cleaned
start <- as.POSIXct('2013-01-01 00:00:00',tz='EST')
end <- as.POSIXct('2016-06-06 23:00:00',tz='EST')

timesteps = data.frame( seq.POSIXt(from = start, to =end , by = "5 min"))
colnames(timesteps) = "Time Index"

dateandhour = function (timeindex){
return(strftime(timeindex, format = "%Y-%m-%d %H"))
}

timesteps ['Date and Hour'] = sapply(timesteps$`Time Index`, dateandhour)

Please let me know what is it that I'm missing here. Thank you so much.


Solution

  • That's because you are specifying the time zone in as.POSIXct, but not in strptime.

    timesteps[1,1]
    [1] "2013-01-01 EST"
    
     strftime(timesteps[1,1], format = "%Y-%m-%d %H")
    [1] "2012-12-31 21"
     strftime(timesteps[1,1], format = "%Y-%m-%d %H",tz='EST')
    [1] "2013-01-01 00"`
    
    dateandhour = function (timeindex){
      return(strftime(timeindex, format = "%Y-%m-%d %H",tz='EST'))
    }
    
    timesteps ['Date and Hour'] = sapply(timesteps$`Time Index`, dateandhour)
    
    head(timesteps)
               Time Index Date and Hour
    1 2013-01-01 00:00:00 2013-01-01 00
    2 2013-01-01 00:05:00 2013-01-01 00
    3 2013-01-01 00:10:00 2013-01-01 00
    4 2013-01-01 00:15:00 2013-01-01 00
    5 2013-01-01 00:20:00 2013-01-01 00
    6 2013-01-01 00:25:00 2013-01-01 00