извлечь время из вектора символов с несколькими часовыми поясами R - PullRequest
5 голосов
/ 11 марта 2020

У меня есть некоторые данные с датой, временем и часовым поясом в виде символьного вектора:

times <- c("2020:03:04 13:31:45+11:00", "2020:03:06 13:28:45+11:00")

Я хочу преобразовать их в вектор объектов POSIXct без необходимости ввода вручную часовой пояс. Если я использую lubridate для создания POSIXct, они преобразуются в UT C, что означает, что у меня неправильное время:

library(lubridate)
ymd_hms(times)
[1] "2020-03-04 02:31:45 UTC" "2020-03-06 02:28:45 UTC"

Это можно исправить, если я использовал tz

ymd_hms(times, tz = 'Australia/Sydney')
[1] "2020-03-04 13:31:45 AEDT" "2020-03-06 13:28:45 AEDT"
gsub(".*[+-]", "", times)
[1] "11:00" "11:00"

Однако, Я хочу автоматизировать процесс для наборов данных с несколькими часовыми поясами, такими как:

times <- c("2020:03:04 13:31:45+11:00", "2020:03:06 13:28:45-06:00")

Моя текущая попытка обойти это попытка извлечь смещение часового пояса и добавить это значение обратно в вектор POSIXct, но у меня нет ' Не удалось получить символ +/- ...:

sub(".*[+-]", "\\1", times)
[1] "11:00" "06:00"

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Один трюк состоит в том, чтобы получить значение смещения и времени отдельно, а затем объединить их вместе.

library(lubridate)

times <- c("2020:03:04 13:31:45+11:00", "2020:03:06 13:28:45-06:00")

offset <- sub(".*([+-].*)", "\\1", times)
offset
#[1] "+11:00" "-06:00"

only_times <- sub('[+-].*', '', times)
only_times
#[1] "2020:03:04 13:31:45" "2020:03:06 13:28:45"

ymd_hms(only_times) - hm(offset)
#[1] "2020-03-04 02:31:45 UTC" "2020-03-06 19:28:45 UTC"
0 голосов
/ 11 марта 2020

Преобразование даты из символьных строк имеет спецификацию %z, которая обозначает смещение часового пояса со знаком. Более конкретно:

Формат% z может использоваться для ввода или вывода: это символьная строка, обычно плюс или минус, за которой следуют две цифры для часов и две для минут.

Поэтому необходимо удалить последний двоеточие из строк, поскольку формат должен состоять из четырех смежных чисел, то есть 1100 вместо 11:00.

times <- sub(":(\\d{2})$", "\\1", c("2020:03:04 13:31:45+11:00", "2020:03:06 13:28:45-06:00"))

strptime(times, format = "%Y:%m:%d %H:%M:%S%z", tz = "UTC") 

[1] "2020-03-04 02:31:45 UTC" "2020-03-06 19:28:45 UTC"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...