我偶然发现了时间转换中的一个问题:
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
答案 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年。