Конвертировать из военного времени в UT C в R - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть набор данных, df1, я хотел бы преобразовать все значения из 24-часовых часов в UT C.

  Date               Name

  1/2/2020 16:46      A
  1/2/2020 16:51      B

Я хотел бы

  Date                  Name

  1/2/2020 4:46:47 PM      A
  1/2/2020 4:51:44 PM      B

Я пробовал:

  df$Date<- format(df$Date, "%m/%d/%Y %I:%M:%S %p")

dput:

 structure(list(Date = structure(1:2, .Label = c("1/2/2020 16:46", 
 "1/2/2020 16:51"), class = "factor"), Name = structure(1:2, .Label = c("A", 
"B"), class = "factor")), class = "data.frame", row.names = c(NA, 
-2L))

Ответы [ 3 ]

2 голосов
/ 27 февраля 2020

Вы можете сначала преобразовать данные в формат POSIXct, а затем использовать format, чтобы получить данные в требуемом формате.

df$Date <- format(as.POSIXct(df$Date, format = "%m/%d/%Y %H:%M"), 
                  "%m/%d/%Y %I:%M:%S %p")
#Can also use mdy_hm from lubridate
#df$Date <- format(lubridate::mdy_hm(df$Date), "%m/%d/%Y %I:%M:%S %p")
df

#                    Date Name
#1 01/02/2020 04:46:00 PM    A
#2 01/02/2020 04:51:00 PM    B
1 голос
/ 27 февраля 2020

Принимая те же предположения, что и в предыдущем ответе Аллана, вот еще один способ перевода из 24 часов в 12 часов.

library(tidyverse)
library(lubridate)

df <- tibble(
      date = c(ymd_hms("2020/01/02 16:46:00", "2020/01/02 16:51:00", tz = "UTC")),
      name = c("A", "B")
      )

df %>% 
    mutate(date_hour = hour(date),
       am_pm = if_else(date_hour > 12, "PM", "AM"),
       date_hour = if_else(date_hour > 12, date_hour - 12, date_hour - 0),
       newdatetime = paste0(date(date), " ", date_hour , ":", minute(date), " ", am_pm)) %>% 
    select(-c(date_hour, am_pm))

df
 # A tibble: 2 x 3
  date                name  newdatetime       
 <dttm>              <chr> <chr>             
 1 2020-01-02 16:46:00 A     2020-01-02 4:46 PM
 2 2020-01-02 16:51:00 B     2020-01-02 4:51 PM

Надеюсь, это поможет!

1 голос
/ 27 февраля 2020

Предполагая, что вы хотите на самом деле преобразовать строку в одном формате в строку в другом формате, вместо того, чтобы использовать ее в качестве (более полезной) фактической даты / времени, вы можете использовать небольшую арифметику c и прерывание строки вместе с mapply:

splits <- strsplit(as.character(df$Date), " |:")
Hours <- as.numeric(sapply(splits, `[`, 2))
AMPM <- c(" AM", " PM")[Hours %/% 12 + 1]
Hours <- Hours %% 13 + Hours %/% 13
df$Date <- mapply(function(x, y, z) paste0(x[1], " ", y, ":", x[3], z), splits, Hours, AMPM)

df
#>               Date Name
#> 1 1/2/2020 4:46 PM    A
#> 2 1/2/2020 4:51 PM    B

Создано в 2020-02-26 с помощью пакета Представить (v0.3.0)

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