2013-06-27 4 views
5

Я читаю файл, содержащий временные метки и спецификацию часового пояса. Я хотел бы иметь возможность определить, распознан ли данный часовой пояс в этом файле R или нет, и укажите мой собственный вариант по умолчанию, если это не так.Проверьте, действительно ли часовой пояс в R

Однако, похоже, as.POSIXct молча возвращается к UTC, если дан неверный часовой пояс, без ошибки или предупреждения я мог перехватывать и обрабатывать:

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

Что бы «правильный» способ R, чтобы проверить, признан ли данный часовой пояс или нет?

+1

Как 'говорит? As.POSIXct' см'? "Часовых поясов" ' – GSee

+0

... в частности,' например ('временных зон') '. –

ответ

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

Пользователи Windows могут найти zone.tab в R_HOME/share/zoneinfo/zone.tab –

4

Вы можете использовать библиотеку часового пояса, которая имеет знания о часовых поясах. Это из версии SVN из RcppBDT:

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> 

В целом, поддержка часового пояса зависит от операционной системы. Поэтому для портативного решения вам нужно указать список допустимых часовых поясов откуда-то ...

И для чего это стоит, я использую файл csv из источников Boost. Копия этого файла часовых поясов, например, here at github.

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. 
+2

Я думаю, что просто использует 'timeDate :: listFinCenter()', который может быть несовременным, поскольку это всего лишь вектор, хранящийся в пакете. – GSee

+0

Может быть, но у нас нет никаких доказательств, которые не обновляются. Поэтому, почему ASCII-файл в системе Unix с часовым поясом будет более надежным. – dickoa

+0

a) Потому что дистрибутив может обновить его. b) Ответ действителен только для подмножества машин, запускающих такую ​​установку, оставляя в стороне другие системы Linux, Windows, OS X ... В общем, поэтому R также отправляет свою копию базы данных Olson в свои источники ... –