我有大量的数据,包括开始时间,停止时间和值。 开始和停止时间因行而异,以5分钟为增量。 我正在尝试创建一个新的数据框,该框具有5分钟的间隔,并且该间隔在一行的开始和结束之内的所有行的和。

我有一个可以工作的脚本,但是它使用了for循环来计算间隔数据帧每一行的总和。

关于如何更快,更有效地执行此操作的任何建议? 当前可能需要很长时间才能运行。

样本数据集“数据”

start           stop           Volume
7/1/2013 0:00   7/1/2013 1:00   10
7/1/2013 0:15   7/1/2013 1:00   5
7/1/2013 0:30   7/1/2013 0:40   3
7/1/2013 0:50   7/1/2013 0:55   1

样本输出数据帧名为“ sum_mw”

IntervalStart   IntervalEnd     Sum_Volume
7/1/2013 0:00   7/1/2013 0:05   10.00 
7/1/2013 0:05   7/1/2013 0:10   10.00 
7/1/2013 0:10   7/1/2013 0:15   10.00 
7/1/2013 0:15   7/1/2013 0:20   15.00 
7/1/2013 0:20   7/1/2013 0:25   15.00 
7/1/2013 0:25   7/1/2013 0:30   15.00 
7/1/2013 0:30   7/1/2013 0:35   18.00 
7/1/2013 0:35   7/1/2013 0:40   18.00 
7/1/2013 0:40   7/1/2013 0:45   15.00 
7/1/2013 0:45   7/1/2013 0:50   15.00 
7/1/2013 0:50   7/1/2013 0:55   16.00 
7/1/2013 0:55   7/1/2013 1:00   15.00 

这是我正在使用的示例代码。

   library(lubridate)

    data$start<-mdy_hm(data$start,tz="UTC")
    data$stop<-mdy_hm(data$stop,tz="UTC")

    sum_mw$IntervalStart<-mdy_hm(sum_mw$IntervalStart,tz="UTC")
    sum_mw$IntervalEnd<-mdy_hm(sum_mw$IntervalEnd,tz="UTC")

    sum_mw$Sum_Volume<-0

    for (i in 1:nrow(sum_mw))
    {
    sum_mw$Sum_Volume[i] <- sum(data[data$start<=sum_mw$IntervalStart[i] & data$stop>=sum_mw$IntervalEnd[i],][,3],na.rm=T)
    }

#1楼 票数:0 已采纳

这是tidyverse一个选项。 转换的列DateTime类,使用后map2在相应的“开始”,停止循环”的值,得到一个seq次uence by 5 min尤特间隔, unnestlist列中,按分组‘间隔’,得到的sum的'体积'

library(tidyverse)
library(lubridate)
df1 %>% 
   mutate_at(1:2, mdy_hm) %>% 
   transmute(Interval = map2(start, stop, seq, by = '5 min'), Volume) %>% 
   unnest(Interval) %>% 
   group_by(Interval) %>% 
   summarise(Sum_Volume = sum(Volume))

数据

df1 <- structure(list(start = c("7/1/2013 0:00", "7/1/2013 0:15", "7/1/2013 0:30", 
"7/1/2013 0:50"), stop = c("7/1/2013 1:00", "7/1/2013 1:00", 
"7/1/2013 0:40", "7/1/2013 0:55"), Volume = c(10L, 5L, 3L, 1L
)), class = "data.frame", row.names = c(NA, -4L))

  ask by mlinn translate from so

未解决问题?本站智能推荐:

2回复

如何在R中将重叠时间段分为重叠和非重叠时间段

我正在寻找将重叠和非重叠时期与 'lubridate' 和 'dplyr' 包(或任何其他可以建议的)结合起来。 这是一个示例数据框: 数据框如下所示: ID 部分 开始 结尾 间隔 ID
1回复

按时间段和R中的ID过滤数据帧

问题: 我试图通过依赖于ID向量的特定日期时间来过滤数据框。 具体来说,对于df$id == "A"观察,我想删除2017-08-05 00:20:00和2017-08-10 13:55:00之间的行。 但是,对于df$id == "B"观察,我想删除不同时间间隔( 2017-08
1回复

dplyr崩溃时间段

我在下面有一个data.frame,我想“压缩”时间段,以便对于每个company_id,它“折叠”时间段,使其间隔为30天。 我尝试了以下方法: 问题在于,第(1)行和第(2)行的间隔应该合并为一个,因此startDate = 2012-09-17和endDate = 2017
2回复

如何在给定时间段内添加时间段的行?

我有一个时间段的数据集,可能会重叠,显示我是否有人( example_df )。 我想获得一个数据集,将大的时间段(从2014-01-01到2014-10-31)分成较小的时间段,其中有人在场( present = 1 )和没有人在场的时间段( present = 0 )。 结果应该看起来像
2回复

将时间段扩展到定期发生的时间戳记

不得不修改原始帖子以包含更好的示例 我有一些基于时间的数据,其中包括开始时间,结束时间和具有以下一般形式的类变量: 制作表格的代码: 期间不一致,并且数据中存在一个隐藏的类:本质上,在此示例中,数据中未明确列出的时间属于第三类。 我需要一种方法来将此表扩展为具有
2回复

从每日数据中删除时间段

我有一个每小时观察的数据集,格式为%Y%m%d %H:%M ,结果像这样2020-03-01 01:00:00在不同的日子里。 如何过滤掉某个时间间隔? 我的目标是在 08:00 和 20:00 之间保持观察。
4回复

使用Lubridate和Dplyr基于时间段创建子组

这应该是一个快速简单的问题。 使用下面的简单数据框,我想使用dplyr和lubridate将所有在2015年4月或之后拥有OnsetDate的客户端分组。这个组将被称为“NewOnset”,其余的将是“OldOnset”。 我是新来的,有点麻烦。
3回复

基于多个时间段计算列的平均值

我需要帮助试图弄清楚如何每 ___ 小时计算一个变量的平均值。 我想每 1/2 小时计算一次平均值,然后每 1、2、4 和 6 小时计算一次。 这是我的数据集: 我希望能够计算每个日期每个时间段的平均 m.Tb。 例如,对于 2015-05-23,我想要每 30 分钟、1 小时、2 小时、4