簡體   English   中英

R時間加上開始/停止時間

[英]R time aggregate with start/stop

我有一組具有開始和停止時間的時間序列數據。 每個事件的持續時間可能從幾秒鍾到幾天不等,我需要計算總和,在此示例中,是當時每個活動小時的總內存使用量。 這是數據示例:

mem_used    start_time            stop_time 
16          2015-10-24 17:24:41   2015-10-25 04:19:44   
80          2015-10-24 17:24:51   2015-10-25 03:14:59   
44          2015-10-24 17:25:27   2015-10-25 01:16:10   
28          2015-10-24 17:25:43   2015-10-25 00:00:31   
72          2015-10-24 17:30:23   2015-10-24 23:58:31   

在這種情況下,它應該給出如下內容:

time                  total_mem
2015-10-24 17:00:00   240
2015-10-24 18:00:00   240
...
2015-10-25 00:00:00   168
2015-10-25 01:00:00   140
2015-10-25 02:00:00   96
2015-10-25 03:00:00   96
2015-10-25 04:00:00   16

我正在嘗試使用聚合函數,但我無法弄清楚。 有任何想法嗎? 謝謝。

這是我使用lubridate

首先,請確保您的日期采用POSIXct格式:

dat$start_time = as.POSIXct(dat$start_time, format = "%Y-%m-%d %H:%M:%S")
dat$stop_time = as.POSIXct(dat$stop_time, format = "%Y-%m-%d %H:%M:%S")

然后使用lubridate創建一個間隔對象:

library(lubridate)
dat$interval <- interval(dat$start_time, dat$stop_time)

現在,我們可以制作一個時間向量,將其替換為您想要的時間:

z <- seq(start = dat$start_time[1], stop = dat$stop_time[5], by = "hours")

總結一下我們有重疊的地方:

out <- data.frame(times = z,
                  mem_used = sapply(z, function(x) sum(dat$mem_used[x %within% dat$interval]))) 

                times mem_used
1 2015-10-24 17:24:41       16
2 2015-10-24 18:24:41      240
3 2015-10-24 19:24:41      240
4 2015-10-24 20:24:41      240
5 2015-10-24 21:24:41      240
6 2015-10-24 22:24:41      240
7 2015-10-24 23:24:41      240

這是使用的數據:

structure(list(mem_used = c(16L, 80L, 44L, 28L, 72L), start_time = structure(c(1445721881, 
1445721891, 1445721927, 1445721943, 1445722223), class = c("POSIXct", 
"POSIXt"), tzone = ""), stop_time = structure(c(1445761184, 1445757299, 
1445750170, 1445745631, 1445745511), class = c("POSIXct", "POSIXt"
), tzone = "")), .Names = c("mem_used", "start_time", "stop_time"
), row.names = c(NA, -5L), class = "data.frame")

這是基於dplyrlubridate另一種解決方案。 確保首先以正確的格式保存數據(例如POSIXct日期)

library(dplyr)
library(lubridate)

glimpse(df)
## Observations: 5
## Variables: 3
## $ mem_used   (int) 16, 80, 44, 28, 72
## $ start_time (time) 2015-10-24 17:24:41, 2015-10-24 17:24:51...
## $ end_time   (time) 2015-10-25 04:19:44, 2015-10-25 03:14:59...

然后,由於我們要每小時匯總一次,因此僅保留小時(刪除分鍾和秒)。

### Remove minutes and seconds
minute(df$start_time) <- 0
second(df$start_time) <- 0
minute(df$end_time) <- 0
second(df$end_time) <- 0

現在最重要的步驟是創建一個新的data.frame ,在start_timeend_time之間每小時每小時排一行。 例如,如果在原始data.frame的第一行中,我們在start_timeend_time之間有5個小時,則我們將以5行結束,並且將mem_used值重復5次。

###
n <- nrow(df)
l <- lapply(1:n, function(i) {
  date <- seq.POSIXt(df$start_time[i], df$end_time[i], by = "hour")
  mem_used <- rep(df$mem_used[i], length(date))
  data.frame(time = date, mem_used = mem_used)
})


df <- Reduce(rbind, l)
glimpse(df)
## Observations: 47
## Variables: 2
## $ time     (time) 2015-10-24 17:00:00, 2015-10-24 18:00:00, ...
## $ mem_used (int) 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,...

最后,我們現在可以使用dplyraggregate (或其他類似函數)進行aggregate

df %>%
  group_by(time) %>%
  summarise(tot = sum(mem_used))
##                   time   tot
##                 (time) (int)
## 1  2015-10-24 17:00:00   240
## 2  2015-10-24 18:00:00   240
## 3  2015-10-24 19:00:00   240
## 4  2015-10-24 20:00:00   240
## 5  2015-10-24 21:00:00   240
## 6  2015-10-24 22:00:00   240
## 7  2015-10-24 23:00:00   240
## 8  2015-10-25 00:00:00   168
## 9  2015-10-25 01:00:00   140
## 10 2015-10-25 02:00:00    96
## 11 2015-10-25 03:00:00    96
## 12 2015-10-25 04:00:00    16

## Or aggregate
aggregate(mem_used ~ time, FUN = sum, data = df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM