R Переход с обычного часового пояса на UTC на несколько местных часовых поясов. - PullRequest
0 голосов
/ 07 декабря 2018

Допустим, у меня есть df с серией ответов на опрос.Каждый ответ имеет отметку времени в формате UTC.У меня также есть местный часовой пояс для каждого человека, который заполнил опрос.

Например:

 df <-  data.frame(day = c("2018-12-06 15:40:29", "2018-12-06 15:25:28", 
"2018-12-06 15:25:28", "2018-12-06 14:09:09"), time_zone = c("EST", "PST", "CST", "EST"))

df$day <- as.POSIXct(df$day, tz = "UTC")

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

df %>% 
  mutate(time_start = format(day, tz = time_zone))

Но я получаю Error in mutate_impl(.data, dots) : Evaluation error: invalid 'tz' value.

Я также пытался с фреймом данных, который имеет часовые пояса в формате GTM

df<-  data.frame(day = c("2018-12-06 15:40:29", "2018-12-06 15:25:28", 
"2018-12-06 15:25:28", "2018-12-06 14:09:09"), 
time_zone = c("GMT-5", "GMT-6", "GMT-7", "GMT-8"))

Есть ли способ изменить серию стандартизированного времени на местное время?

1 Ответ

0 голосов
/ 07 декабря 2018

Несколько проблем здесь:

  1. format (и другие функции, связанные с временем) принимает аргумент длины-1 только для tz;
  2. часовых поясов, распознаваемых Rне включайте популярные "CST", "PST" и т. д.

Чтобы исправить первое, достаточно использовать Map или mapply.

Второетребует немного больше исследований, к сожалению.Такие зоны, как "PST" и подобные, хотя и популярны, по крайней мере, в США, если не в других странах, не являются допустимыми строками часовых поясов (см .: CCTZ, библиотека C ++ для перевода между часовыми поясами, говорит так ).Также не "GMT-7" и др., Хотя последний может быть подделан с помощью с добавлением Etc/, например: "Etc/GMT-7".Или вы можете использовать альтернативы "America/New_York" или "US/Eastern".

df$time_zone <- c("US/Eastern", "US/Pacific", "US/Central", "US/Eastern")
df
#                   day  time_zone
# 1 2018-12-06 15:40:29 US/Eastern
# 2 2018-12-06 15:25:28 US/Pacific
# 3 2018-12-06 15:25:28 US/Central
# 4 2018-12-06 14:09:09 US/Eastern
mapply(format, df$day, tz = "GMT")
# [1] "2018-12-06 15:40:29" "2018-12-06 15:25:28" "2018-12-06 15:25:28"
# [4] "2018-12-06 14:09:09"
mapply(format, df$day, tz = df$time_zone)
# [1] "2018-12-06 10:40:29" "2018-12-06 07:25:28" "2018-12-06 09:25:28"
# [4] "2018-12-06 09:09:09"

Все сразу распознаваемые форматы для часовых поясов R находятся в векторе из 594 элементов:

str(OlsonNames())
#  chr [1:592] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa" ...
#  - attr(*, "Version")= chr "2018e"
set.seed(2)
sample(OlsonNames(), size=8)
# [1] "America/El_Salvador"  "Etc/GMT+8"            "Atlantic/Madeira"    
# [4] "America/Creston"      "Pacific/Port_Moresby" "Pacific/Ponape"      
# [7] "America/Atka"         "GB-Eire"             
grep("US/", OlsonNames(), value = TRUE)
#  [1] "US/Alaska"         "US/Aleutian"       "US/Arizona"       
#  [4] "US/Central"        "US/East-Indiana"   "US/Eastern"       
#  [7] "US/Hawaii"         "US/Indiana-Starke" "US/Michigan"      
# [10] "US/Mountain"       "US/Pacific"        "US/Pacific-New"   
# [13] "US/Samoa"         

В этом примере вы увидите одну из альтернатив, которые вы можете использовать: "Etc/GMT+8".Обратите внимание, что + относится к западу основного меридиана, поэтому

mapply(format, df$day, tz = "US/Eastern")
# [1] "2018-12-06 10:40:29" "2018-12-06 10:25:28" "2018-12-06 10:25:28"
# [4] "2018-12-06 09:09:09"
mapply(format, df$day, tz = "Etc/GMT+5")
# [1] "2018-12-06 10:40:29" "2018-12-06 10:25:28" "2018-12-06 10:25:28"
# [4] "2018-12-06 09:09:09"

Предостережение emptor: при использовании "US/Eastern" следует учитывать летнее время, где это необходимо;"Etc/GMT+5" нет, я считаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...