конвертировать несколько часовых поясов в один - г - PullRequest
3 голосов
/ 01 апреля 2019

У меня есть этот фрейм данных:

df <- data.frame(datetime = c("2018-08-23 11:03:25 0300", "2018-08-17 12:54:09 0300", "2018-08-07 17:15:29 0400", "2018-08-07 10:41:30 0400", "2018-08-07 10:37:37 0400", "2018-08-03 10:36:49 0400", "2018-07-26 12:52:28 0400", "2018-07-10 18:06:02 0400", "2018-07-04 17:52:24 0400", "2018-06-20 15:28:08 0400"),
           stringsAsFactors = FALSE)
> df
                       datetime
1  2018-08-23 11:03:25 0300
2  2018-08-17 12:54:09 0300
3  2018-08-07 17:15:29 0400
4  2018-08-07 10:41:30 0400
5  2018-08-07 10:37:37 0400
6  2018-08-03 10:36:49 0400
7  2018-07-26 12:52:28 0400
8  2018-07-10 18:06:02 0400
9  2018-07-04 17:52:24 0400
10 2018-06-20 15:28:08 0400

Мне нужно преобразовать его в тот же часовой пояс и удалить его часовой пояс (почему? Потому что это облегчит выполнение некоторых вычислений часов / дней / недель между векторамитого же типа)

Ожидаемый результат:

              datetime
1  2018-08-23 12:03:25    # this was UTC +3, now +1 hour is UTC +4
2  2018-08-17 13:54:09    # this was UTC +3, now +1 hour is UTC +4
3  2018-08-07 17:15:29    # this is UTC +4
4  2018-08-07 10:41:30    # this is UTC +4
5  2018-08-07 10:37:37    # this is UTC +4
6  2018-08-03 10:36:49    # this is UTC +4
7  2018-07-26 12:52:28    # this is UTC +4
8  2018-07-10 18:06:02    # this is UTC +4
9  2018-07-04 17:52:24    # this is UTC +4
10 2018-06-20 15:28:08    # this is UTC +4

Любые идеи?

РЕДАКТИРОВАТЬ:

Этот вопрос отместо, и это решается аргументом tz, как вы можете вставить место там.Однако в этом вопросе у меня нет аргумента, чтобы распознать часовой пояс внутри строки.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Решение с использованием пакетов tidyverse и lubridate.

library(tidyverse)
library(lubridate)

df <- data.frame(datetime = c("2018-08-23 11:03:25 0300", "2018-08-17 12:54:09 0300", "2018-08-07 17:15:29 0400", "2018-08-07 10:41:30 0400", "2018-08-07 10:37:37 0400", "2018-08-03 10:36:49 0400", "2018-07-26 12:52:28 0400", "2018-07-10 18:06:02 0400", "2018-07-04 17:52:24 0400", "2018-06-20 15:28:08 0400"),
                 stringsAsFactors = FALSE)

df2 <- df %>%
  separate(datetime, into = c("date", "time", "timezone"), sep = " ") %>%
  unite(col = datetime, c("date", "time"), sep = " ") %>%
  mutate(datetime = ymd_hms(datetime)) %>%
  mutate(datetime = if_else(timezone %in% "0300", datetime + hours(1), datetime)) %>%
  select(-timezone)
df2
#               datetime
# 1  2018-08-23 12:03:25
# 2  2018-08-17 13:54:09
# 3  2018-08-07 17:15:29
# 4  2018-08-07 10:41:30
# 5  2018-08-07 10:37:37
# 6  2018-08-03 10:36:49
# 7  2018-07-26 12:52:28
# 8  2018-07-10 18:06:02
# 9  2018-07-04 17:52:24
# 10 2018-06-20 15:28:08
2 голосов
/ 01 апреля 2019

Это работает,

Использование library(tidyverse) и library(stringr),

df <- data.frame(datetime = c("2018-08-23 11:03:25 0300", "2018-08-17 12:54:09 0300", "2018-08-07 17:15:29 0400", "2018-08-07 10:41:30 0400", "2018-08-07 10:37:37 0400", "2018-08-03 10:36:49 0400", "2018-07-26 12:52:28 0400", "2018-07-10 18:06:02 0400", "2018-07-04 17:52:24 0400", "2018-06-20 15:28:08 0400"),
                     stringsAsFactors = FALSE)

df2 <-  as.tibble(stringr::str_split_fixed(df$datetime, " ", 3)) %>% 
  mutate(V3 = -((as.numeric(V3)/100)-4)) %>% 
  mutate(V4 = as.numeric(stringr::str_split_fixed(V2, ":", 3)[,1]) + V3) %>% 
  mutate(V5 = stringr::str_split_fixed(.$V2, ":", 3)[,2]) %>% 
  mutate(V6 = stringr::str_split_fixed(.$V2, ":", 3)[,3]) %>% 
  mutate(V2 = paste(V4, V5, V6, sep = ":")) %>% 
  mutate(datetime = paste(V1, V2, sep = " ")) %>% 
  dplyr::select(datetime)

Некоторое объяснение: сначала мы разбиваем столбец datetime на 3 части, затем мы меняем часовой пояспараметр, в то, что мы можем просто добавить.Затем разделите строки времени и даты, добавьте параметр часового пояса, а затем вставьте все вместе.Это можно сделать в несколько строк, но вы можете хорошо выполнять шаги, выполняя их по одной за раз.

...