2015-11-21 3 views
3

У меня есть dataframe так:with_tz с вектором часовых поясов

library(dplyr) 
data <- data_frame(
    timestamp_utc = c('2015-11-18 03:55:04', '2015-11-18 03:55:08', 
        '2015-11-18 03:55:10'), 
    local_tz = c('America/New_York', 'America/Los_Angeles', 
       'America/Indiana/Indianapolis') 
) 

Мне нужно создать новую переменную, которая преобразует UTC метку времени к местному времени, как это определено в local_tz колонке. Однако и format, и with_tz (от lubridate) ожидают только одного часового пояса, а не вектора часовых поясов. Я ищу что-то вроде этого:

mutate(data, timestamp_local = with_tz(timestamp_utc, tzone = local_tz)) 

Любые идеи?

ответ

3

Это один из способов. При этом результат должен быть строкой, иначе unlist() или c() вернет результат в системный часовой пояс для каждого элемента в списке.

Это все еще медленно, хотя, поскольку оно не векторизовано.

> get_local_time <- function(timestamp_utc, local_tz) { 
    l <- lapply(seq(length(timestamp_utc)), 
       function(x) {format(with_tz(timestamp_utc[x], local_tz[x]), "%FT%T%z")}) 
    unlist(l) 
    } 

> mutate(data, timestamp_local = get_local_time(timestamp_utc, tzone = local_tz)) 

Source: local data frame [3 x 3] 

     timestamp_utc      local_tz   timestamp_local 
       (time)      (chr)     (chr) 
1 2015-11-18 03:55:04    America/New_York 2015-11-17T22:55:04-0500 
2 2015-11-18 03:55:08   America/Los_Angeles 2015-11-17T19:55:08-0800 
3 2015-11-18 03:55:10 America/Indiana/Indianapolis 2015-11-17T22:55:10-0500 

Обновление 2015-11-24

Использование dplyr::combine() вместо unlist() позволяет переменной оставаться DateTimes с правом часовых поясов атрибуты, а не преобразовывать в строки.

> get_local_time <- function(timestamp_utc, local_tz) { 
    l <- lapply(seq(length(timestamp_utc)), 
       function(x) {with_tz(timestamp_utc[x], local_tz[x])}) 
    combine(l) 
    } 

> mutate(data, timestamp_local = get_local_time(timestamp_utc, tzone = local_tz)) 

Source: local data frame [3 x 3] 

     timestamp_utc      local_tz  timestamp_local 
       (time)      (chr)    (time) 
1 2015-11-18 03:55:04    America/New_York 2015-11-17T22:55:04 
2 2015-11-18 03:55:08   America/Los_Angeles 2015-11-17T19:55:08 
3 2015-11-18 03:55:10 America/Indiana/Indianapolis 2015-11-17T22:55:10 
+0

Мне не удалось запустить пример successt с данными, указанными выше: 'Ошибка: не применимый метод для 'reclass_date', примененный к объекту класса" character "' – MartinT

3

Сначала убедитесь, что данные загружены в качестве даты - я должен был преобразовать в дату первого:

data$timestamp_utc <- as.POSIXct(data$timestamp_utc, tz = "UTC") 

Затем вы можете использовать функцию rowwise из dplyr, в сочетании с do:

library(lubridate) 
library(dplyr) 
z <- data %>% rowwise() %>% 
       do(timestamp_local = with_tz(.$timestamp_utc, tzone = .$local_tz)) 
data$timestamp_local <- z$timestamp_local 

data$timestamp_local 
[[1]] 
[1] "2015-11-17 22:55:04 EST" 

[[2]] 
[1] "2015-11-17 19:55:08 PST" 

[[3]] 
[1] "2015-11-17 22:55:10 EST" 

Нам нужно сделать список timestamp_local, так как в противном случае все временные зоны будут преобразованы обратно в один, вы можете иметь только один часовой пояс в векторе).

+0

Это работает! Тем не менее, он медленный. Интересно, можно ли векторизовать 'with_tz'. Я перейду к github и отправлю его как запрос функции. – josiekre

+0

На самом деле это не сработало. Это сделало смещение одинаковым для всех трех строк. Ответ должен иметь -0500 для Нью-Йорка и Индианаполиса и -0800 для Лос-Анджелеса. – josiekre

+0

Ugh, теперь он должен быть исправлен – jeremycg

Смежные вопросы