13

我想使用 R 进行时间序列分析。我想制作一个时间序列模型并使用包 timeDate 和 forecast 中的函数。

我有 CET 时区的日内数据(15 分钟数据,每小时 4 个数据点)。3 月 31 日实施夏令时,我缺少通常拥有的 96 个数据点中的 4 个。在 10 月 28 日,我有 4 个数据点太多,因为时间切换回来了。

对于我的时间序列模型,我总是需要 96 个数据点,否则日内的季节性会变得混乱。

你有这方面的经验吗?您是否知道有助于自动化此类数据处理的 R 函数或包 - 一些优雅的东西?谢谢!

4

3 回答 3

17

我对来自传感器的水文数据也有类似的问题。我的时间戳是 UTC+1 (CET) 并且没有切换到夏令时 (UTC+2, CEST)。由于我不希望我的数据中断一小时(如果使用 UTC 就是这种情况),我采用%zstrptime. 在?strptime你会发现:

%z与 UTC 的小时和分钟的有符号偏移量,因此 -0800 比 UTC 晚 8 小时。

例如:2012 年,标准时间到 DST 的切换发生在 2012 年 3 月 25 日,所以这一天没有 02:00。如果您尝试将“2012-03-25 02:00:00”转换为 POSIXct-Object,

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

您不会收到错误或警告,您只会得到没有时间的日期(此行为已记录在案)。

使用format = "%z"给出了预期的结果:

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

为了便于导入,我编写了一个带有适当默认值的小函数:

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"
于 2012-12-13T19:29:13.343 回答
14

如果您不想要夏令时,请转换为没有夏令时的时区(例如 GMT、UTC)。

times <- .POSIXct(times, tz="GMT")
于 2012-12-13T17:32:35.310 回答
1

这是获取夏令时偏移量 - 例如中央夏令时

> Sys.time()

"2015-08-20 07:10:38 CDT" # 我在美国/芝加哥白天时间

> 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")

-5小时的时差

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

-5

一些灵感来自

在 R 中转换时区:提示、技巧和陷阱

于 2015-08-20T12:58:02.193 回答