我正在阅读包含时间戳和时区规范的文件。我希望能够检测此文件上的给定时区是否被R识别,并提供我自己的默认值,如果不是。
然而,如果给出一个无效的时区,似乎as.POSIXct会无声地回退到UTC,没有错误或警告我可以抓住并处理:
> as.POSIXct("1970-01-01", tz="blah")
[1] "1970-01-01 UTC"
在R中检查给定时区是否被识别的“适当”方式是什么?
答案 0 :(得分:4)
您可以使用具有时区知识的时区库。这是来自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文件。该时区文件的副本是例如here at github。
答案 1 :(得分:4)
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
答案 2 :(得分:1)
您还可以使用Rmetrics
包timeDate
包来检查时区。
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.
答案 3 :(得分:0)
自从我想弄清楚同一件事以来,就偶然发现了这个问题。原来使用以下方法。将此留给可能偶然发现此问题的任何人...
Function SumCellsByColor(rData As Range, cellRefColor As Range)
Dim indRefColor As Long
Dim cellCurrent As Range
Dim sumRes
Application.Volatile
sumRes = 0
indRefColor = cellRefColor.Cells(1, 1).Interior.Color
For Each cellCurrent In rData
If indRefColor = cellCurrent.Interior.Color Then
sumRes = WorksheetFunction.Sum(cellCurrent, sumRes)
End If
Next cellCurrent
SumCellsByColor = sumRes
End Function