我对来自传感器的水文数据也有类似的问题。我的时间戳是 UTC+1 (CET) 并且没有切换到夏令时 (UTC+2, CEST)。由于我不希望我的数据中断一小时(如果使用 UTC 就是这种情况),我采用%z
了strptime
. 在?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"