我正在阅读一个包含时间戳和时区规范的文件。我希望能够检测该文件上的给定时区是否被 R 识别,并提供我自己的默认值以防它不是。
但是,如果给定一个无效的时区,似乎 as.POSIXct 会默默地回退到 UTC,而我可以捕捉和处理没有错误或警告:
> as.POSIXct("1970-01-01", tz="blah")
[1] "1970-01-01 UTC"
R中检查给定时区是否被识别的“正确”方法是什么?
我正在阅读一个包含时间戳和时区规范的文件。我希望能够检测该文件上的给定时区是否被 R 识别,并提供我自己的默认值以防它不是。
但是,如果给定一个无效的时区,似乎 as.POSIXct 会默默地回退到 UTC,而我可以捕捉和处理没有错误或警告:
> as.POSIXct("1970-01-01", tz="blah")
[1] "1970-01-01 UTC"
R中检查给定时区是否被识别的“正确”方法是什么?
help("time zones")
详细解释了很多时区问题,值得一读。
结果会因您的操作系统而异,但会example("time zones")
显示您如何读取 zone.tab 文件(如果您的操作系统有)。
tzfile <- "/usr/share/zoneinfo/zone.tab"
tzones <- read.delim(tzfile, row.names = NULL, header = FALSE,
col.names = c("country", "coords", "name", "comments"),
as.is = TRUE, fill = TRUE, comment.char = "#")
str(tzones$name)
#chr [1:415] "Europe/Andorra" "Asia/Dubai" "Asia/Kabul" "America/Antigua" "America/Anguilla" ...
NROW(tzones)
#[1] 415
head(tzones)
# country coords name comments
#1 AD +4230+00131 Europe/Andorra
#2 AE +2518+05518 Asia/Dubai
#3 AF +3431+06912 Asia/Kabul
#4 AG +1703-06148 America/Antigua
#5 AI +1812-06304 America/Anguilla
#6 AL +4120+01950 Europe/Tirane
您可以使用具有时区知识的时区库。这是来自 RcppBDT 的 SVN 版本:
R> tz <- new(bdtTz, "America/Chicago")
R> cat("tz object initialized as: ", format(tz), "\n")
tz object initialized as: America/Chicago
R> tzBAD <- new(bdtTz, "blah")
Error in new_CppObject_xp(fields$.module, fields$.pointer, ...) :
Unknown region supplied, no tz object created
R>
通常,时区支持取决于操作系统。因此,对于便携式解决方案,您需要从某个地方提供有效时区列表......
对于它的价值,我正在使用来自 Boost 来源的 csv 文件。该时区文件的副本例如在 github 上。
只是偶然发现了这个问题,因为我想弄清楚同样的事情。原来使用以下。把这个留给任何可能偶然发现这个问题的人......
is.valid.timezone <- function(timezone) {
return(timezone %in% (OlsonNames()))
}
您还可以使用Rmetrics
packagetimeDate
包来检查时区。
require(timeDate)
timeDate("1970-01-01", zone = "Africa/Dakar")
## [1] [1970-01-01]
timeDate("1970-01-01", zone = "blah")
## Error in .formatFinCenterNum(unclass(ct), zone, type = "any2gmt") :
## 'blah' is not a valid FinCenter.