检查R中的时区是否有效

时间:2013-06-27 14:11:38

标签: r

我正在阅读包含时间戳和时区规范的文件。我希望能够检测此文件上的给定时区是否被R识别,并提供我自己的默认值,如果不是。

然而,如果给出一个无效的时区,似乎as.POSIXct会无声地回退到UTC,没有错误或警告我可以抓住并处理:

> as.POSIXct("1970-01-01", tz="blah")
[1] "1970-01-01 UTC"

在R中检查给定时区是否被识别的“适当”方式是什么?

4 个答案:

答案 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)

您还可以使用RmetricstimeDate包来检查时区。

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