R日期时间转换时区

时间:2016-01-26 13:53:21

标签: r

我偶然发现了时间转换中的一个问题:

times <- c("1976-05-01 01:00:00", "1977-05-01 01:00:00")
times2 <- as.POSIXct(strptime(times, format="%Y-%m-%d %H:%M", tz="CET" ))
data.frame(times, times2, as.Date(times2), as.Date(times2, tz="CET"))

我在R(*)上得到的是:

1976-05-01 01:00:00   1976-05-01   1976-05-01
1977-05-01 01:00:00   1977-04-30   1977-05-01

我知道时区和转换可能是一个真正的痛苦。在as.Date中很容易忘记tz =“CET”。

什么是不错过这样的错误的好策略? (我只抓住它,因为与另一个May数据集合并产生了NAs)。

奖励:为什么1977年之后默认tz的转换会发生变化?

(*):sessionInfo()

R version 3.2.2 (2015-08-14)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252

3 个答案:

答案 0 :(得分:2)

转换前首先进行格式化通常可以解决此类问题,还可以检查times2ch是否给出了您想要的内容:

times2ch <- format(times2)
as.Date(times2ch)
## [1] "1976-05-01" "1977-05-01"

请参阅R News 4/1

中的帮助台文章

答案 1 :(得分:1)

在搜索SO并寻找答案后,我开始使用lubridate和force_tz()。

作为奖励,lubridate的mdy_hms()比基本R strptime快一个数量级且相似。处理数百万行时非常有用。

答案 2 :(得分:0)

如果您检查他们何时开始使用DST进行CET,您会发现直到1976年,没有使用DST, 例如,检查此链接,以查看DST何时开始检查此处 http://www.timeanddate.com/time/zone/belgium/brussels 并找到1970 - 1980年。