Извлечь таймфрейм из фактора datetime - R - PullRequest
0 голосов
/ 18 мая 2018

У меня есть этот пример кода (это тип данных фактора):

> head(df$Timeframe_x1)
[1] 30/12/1899 13:12:59 30/12/1899 12:59:20 30/12/1899 11:58:26 30/12/1899 11:15:45
[5] 30/12/1899 04:17:14 30/12/1899 03:08:34

Как эффективно преобразовать его в значения таймера (часы, минуты или секунды), и учитывая, что этотаймер начинается с 30/12/1899 00:00:00, что означает 0 часов, 0 минут и 0 секунд, накопленных?

Это мой текущий код:

z <- dmy_hms(df$Timeframe_x1)
df$Hours <- hour(z)
df$Minutes <- minute(z)
df$Seconds <- second(z)
df$TotalSeconds <- df$Hours*3600 + df$Minutes*60 + df$Seconds

Это работает, но я ищу болееэффективный, поскольку я должен применить его к 65 столбцам (df$timeframe_x1 до df$timeframe_x65), а не только к этому.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Вы можете использовать difftime и lubridate::seconds_to_period, чтобы получить разницу во времени для значений таймера.dplyr::mutate_at может быть хорошим вариантом для использования, так как OP упомянул, что он получил более 65 столбцов.

library(dplyr)
library(lubridate)

# Start time for Timer
start_time <- dmy_hms("30/12/1899 00:00:00")

df %>% mutate_at(vars(starts_with("T")), dmy_hms) %>%
 mutate_at(vars(starts_with("T")), 
  funs(Timer = seconds_to_period(difftime(. , start_time, units = "secs"))))

#   ID                  T1                  T2    T1_Timer    T2_Timer
# 1  1 1899-12-30 13:12:59 1899-12-30 13:12:59 13H 12M 59S 13H 12M 59S
# 2  2 1899-12-30 12:59:20 1899-12-30 12:59:20 12H 59M 20S 12H 59M 20S
# 3  3 1899-12-30 11:58:26 1899-12-30 11:58:26 11H 58M 26S 11H 58M 26S
# 4  4 1899-12-30 11:15:45 1899-12-30 11:15:45 11H 15M 45S 11H 15M 45S
# 5  5 1899-12-30 04:17:14 1899-12-30 04:17:14  4H 17M 14S  4H 17M 14S
# 6  6 1899-12-30 03:08:34 1899-12-30 03:08:34   3H 8M 34S   3H 8M 34S      

Данные: Пример данных.

Timeframe_x1 <- c("30/12/1899 13:12:59", "30/12/1899 12:59:20", "30/12/1899 11:58:26",
"30/12/1899 11:15:45", "30/12/1899 04:17:14", "30/12/1899 03:08:34")


df <- data.frame(ID = 1:6, T1 = Timeframe_x1, T2 = Timeframe_x1)

df
# ID                  T1                  T2
# 1  1 30/12/1899 13:12:59 30/12/1899 13:12:59
# 2  2 30/12/1899 12:59:20 30/12/1899 12:59:20
# 3  3 30/12/1899 11:58:26 30/12/1899 11:58:26
# 4  4 30/12/1899 11:15:45 30/12/1899 11:15:45
# 5  5 30/12/1899 04:17:14 30/12/1899 04:17:14
# 6  6 30/12/1899 03:08:34 30/12/1899 03:08:34
str(df)
# 'data.frame': 6 obs. of  3 variables:
#   $ ID: int  1 2 3 4 5 6
# $ T1: Factor w/ 6 levels "30/12/1899 03:08:34",..: 6 5 4 3 2 1
# $ T2: Factor w/ 6 levels "30/12/1899 03:08:34",..: 6 5 4 3 2 1

Примечание: Я изменил имена столбцов на T1 и T2 для простоты отображения решения в SO.

0 голосов
/ 18 мая 2018

Мы можем использовать lapply, чтобы сделать это

nm1 <- paste0("Timeframe_x", 1:65)
df[nm1] <- lapply(df[nm1], f1)

, где f1 - это функция

f1 <- function(x) {
   z <- dmy_hms(x)
   Hours <- hour(z)
   Minutes <- minute(z)
   Seconds <- second(z)
   Hours*3600 + Minutes*60 + Seconds     
}   

Или это можно сделать с помощью tidyverse

library(tidyverse)
library(magrittr)
df %<>%
    mutate_at(vars(nm1), f1)

Или используя data.table

library(data.table)
setDT(df)[, (nm1) := lapply(.SD, f1), .SDcols = nm1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...