I want to decompose hourly time series with decompose
, ets
, or stl
or whatever function. Here is an example code and its output:
Why does the timezone for
time_index
change back to CEST?
Because you didn't specify tz=
in your call to as.POSIXct
. It will only pick up the timezone from the string if it's specified by offset from UTC (e.g. -0800). See ?strptime
.
R> head(time_index <- as.POSIXct(time_index1, "UTC"))
[1] "2012-05-15 12:00:00 UTC" "2012-05-15 13:00:00 UTC"
[3] "2012-05-15 14:00:00 UTC" "2012-05-15 15:00:00 UTC"
[5] "2012-05-15 16:00:00 UTC" "2012-05-15 17:00:00 UTC"
When I call
tzone
orindexTZ
there is no timezone but theindex
clearly show that the times are defined with a timezone.
All POSIXct objects have a timezone. A timezone of ""
simply means R wasn't able to determine a specific timezone, so it is using the timezone specified by your operating system. See ?timezone
.
Only the ets
function works because your xts object doesn't have a properly defined frequency
attribute. This is a known limitation of xts objects, and I have plans to address them over the next several months. You can work around the current issues by explicitly specifying the frequency
attribute after calling the xts constructor.
R> set.seed(1)
R> value <- rnorm(n = length(time_index1))
R> eventdata1 <- xts(value, order.by = time_index)
R> attr(eventdata1, 'frequency') <- 24 # set frequency attribute
R> decompose(as.ts(eventdata1)) # decompose expects a 'ts' object
You can use tbats
to decompose hourly data:
require(forecast)
set.seed(1)
time_index1 <- seq(from = as.POSIXct("2012-05-15 07:00"),
to = as.POSIXct("2012-05-17 18:00"), by="hour")
value <- rnorm(n = length(time_index1))
eventdata1 <- msts(value, seasonal.periods = c(24) )
seasonaldecomp <- tbats(eventdata1)
plot(seasonaldecomp)
Additionally, using msts
instead of xts
allows you to specify multiple seasons/cycles, fore instance hourly as well as daily: c(24, 24*7)