从因素日期时间中提取时间范围 - R

时间:2018-05-18 17:16:04

标签: r datetime time timer

我有这个示例代码(它是一个因子数据类型):

> 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秒? / p>

这是我目前的代码:

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_x1df$timeframe_x65),而不仅仅是这一列。

2 个答案:

答案 0 :(得分:0)

我们可以使用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]

答案 1 :(得分:0)

您可以使用 char a[]={'2','3','4','5'}; difftime来获取计时器值的时间差异。 lubridate::seconds_to_period可以是一个很好的选择,因为OP提到他有超过65列。

dplyr::mutate_at

数据:示例数据。

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,以简化在SO中显示解决方案。