处理我们切换到夏令时和返回时的日期

时间:2012-12-13 17:24:57

标签: r datetime timezone dst

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

我在CET时区有日内数据(15分钟数据,每小时4个数据点)。在3月31日实施了夏令时,我错过了我通常拥有的96个数据点。 10月28日,随着时间的推移,我有4个数据点太多了。

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

你有这方面的经验吗?你知道一个R函数或一个有助于自动化这种数据处理的包 - 一些优雅吗? 谢谢!

3 个答案:

答案 0 :(得分:14)

我对传感器的水文数据也有类似的问题。我的时间戳是UTC + 1(CET),并没有切换到夏令时(UTC + 2,CEST)。因为我不希望我的数据关闭一小时(如果使用UTC就是这种情况)我采用%z转换规范strptime。在?strptime中,您会找到:

  

%z以小时和分钟为单位的签名偏移量,因此-0800为8小时   在UTC之后。

例如:2012年,从标准时间到DST的转换发生在2012-03-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"

答案 1 :(得分:11)

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

times <- .POSIXct(times, tz="GMT")

答案 2 :(得分: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

一些灵感来自

Converting time zones in R: tips, tricks and pitfalls