如何使用定期间隔分割的时间数据重构数据框(并计算更新的持续时间)

问题描述 投票:0回答:1

我有一个数据框如下:

tab <- data.frame(Behav = c("Rest","Eat","Eat"),      
              Behav.start= c("14:10:40","14:13:25","17:35:00"),
              Behav.end = c("14:13:24","17:31:05","17:37:25"), 
              Behav.dur.s = c("164","19060","145"))

Behav    Behav.start    Behav.end    Behav.dur.s
 Rest     14:10:40       14:13:24      164
 Eat      14:13:25       17:31:05      11860
 Eat      17:35:00       17:37:25      145       

注: 'Behav.dur.s'='Behav.start'和'Behav.end'之间的时间间隔(以秒为单位)

我想计算每小时的时间预算,换句话说,我想计算一个人在每个1小时的间隔期间休息,吃饭等的时间。

然后,我尝试(但失败了......)重新构建我的初始数据框选项卡以获取新的数据框,例如行为持续超过一小时的行(Behav.dur.s> 3600)被替换为n'重复'具有给定行为的行持续1小时间隔,更新Behav.start,Behav.end和Behav.dur.s

Behav    Behav.start    Behav.end    Behav.dur.s
 Rest     14:10:40       14:13:24      164
 Eat      14:13:25       15:00:00      2795
 Eat      15:00:00       16:00:00      3600
 Eat      16:00:00       17:00:00      3600
 Eat      17:00:00       17:31:05      1865
 Eat      17:35:00       17:37:25      145 

然后,我将能够计算每小时的时间预算。

我非常感谢你的帮助,非常感谢你!

r time split duration
1个回答
0
投票

考虑以下步骤,以下假设在一天中的所有24小时内使用交叉连接,然后将子集设置为特定持续时间,最后重新计算开始/结束点。

Assumptions

  • 时间来源于发布的HH:MM的字符串格式;
  • 时间范围仅在一天内(即午夜时间,00:0023:59一天)。否则按天和rbind分开;
  • 选项卡中的数据大小合理,因为交叉连接将为每行选项卡添加(在子集之前)24行。

Steps

  1. 数据构建/转换 # CONVERT TIMES TO POSIXct TYPES tab <- within(tab, { Behav.start = as.POSIXct(Behav.start, tz="GMT", format="%H:%M:%S") Behav.end = as.POSIXct(Behav.end, tz="GMT", format="%H:%M:%S") }) # BUILD DF OF ALL 24 HOURS DURATIONS FOR CURRENT DATE hours_df <- data.frame(start_hour = as.POSIXlt(as.POSIXct(Sys.Date()) + c(0:23)*60*60), end_hour = as.POSIXlt(as.POSIXct(Sys.Date()) + c(1:24)*60*60))
  2. 交叉连接+子集 mdf <- merge(tab, hours_df, all=TRUE) sdf <- subset(mdf, Behav.start <= end_hour & Behav.end >= start_hour)
  3. 计算最终开始/结束 final_df <- within(sdf, { final_start <- as.POSIXct(ifelse(Behav.start > start_hour, Behav.start, start_hour), tz="GMT", origin="1970-01-01") final_end <- as.POSIXct(ifelse(Behav.end < end_hour, Behav.end, end_hour), tz="GMT", origin="1970-01-01") final_dur <- as.numeric(difftime(final_end, final_start, units="secs")) rm(Behav.start, Behav.end, start_hour, end_hour, Behav.dur.s) })[c("Behav", "final_start", "final_end", "final_dur")] # CONVERT DATE/TIME TO STRING TIME final_df <- data.frame(within(final_df, { final_start <- format(final_start, format="%H:%M:%S") final_end <- format(final_end, format="%H:%M:%S") }), row.names = NULL) final_df # Behav final_start final_end final_dur # 1 Rest 14:10:40 14:13:24 164 # 2 Eat 14:13:25 15:00:00 2795 # 3 Eat 15:00:00 16:00:00 3600 # 4 Eat 16:00:00 17:00:00 3600 # 5 Eat 17:00:00 17:31:05 1865 # 6 Eat 17:35:00 17:37:25 145
© www.soinside.com 2019 - 2024. All rights reserved.