Несколько проблем здесь:
format
(и другие функции, связанные с временем) принимает аргумент длины-1 только для tz
; - часовых поясов, распознаваемых 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"
нет, я считаю.