我对传感器的水文数据也有类似的问题。我的时间戳采用 UTC+1 (CET),并未切换为夏令时(UTC+2、CEST)。因为我不希望我的数据有一个小时的偏差(如果使用 UTC,就会出现这种情况),所以我采取了%z
的转换规范strptime
. In ?strptime
你会找到:
%z
与 UTC 的小时和分钟有符号偏移,因此 -0800 是 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"
您不会收到错误或警告,您只会收到没有时间的日期(此行为已记录)。
Using 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"