gpt4 book ai didi

r - 计算给定时间段内时间间隔的持续时间

转载 作者:行者123 更新时间:2023-12-01 12:15:29 25 4
gpt4 key购买 nike

我有一个包含开始时间和长度(以秒为单位)的数据框:

dates<-data.frame(start=as.POSIXct(c("2010-04-03 03:02:38 UTC","2010-04-03 06:03:14 UTC","2010-04-20 03:05:52 UTC","2010-04-20 03:17:42 UTC","2010-04-21 03:09:38 UTC","2010-04-21 07:10:14 UTC","2010-04-21 08:12:52 UTC","2010-04-23 03:13:42 UTC","2010-04-23 03:25:42 UTC","2010-04-23 03:36:38 UTC","2010-04-23 08:58:14 UTC","2010-04-24 03:21:52 UTC","2010-04-24 03:22:42 UTC","2010-04-24 07:24:19 UTC","2010-04-24 07:55:19 UTC")),length=c(3600,300,900,3600,300,900,3600,300,900,3600,300,900,3600,300,900))

> dates
start length
1 2010-04-03 03:02:38 3600
2 2010-04-03 06:03:14 300
3 2010-04-20 03:05:52 900
4 2010-04-20 03:17:42 3600
5 2010-04-21 03:09:38 300
6 2010-04-21 07:10:14 900
7 2010-04-21 08:12:52 3600
8 2010-04-23 03:13:42 300
9 2010-04-23 03:25:42 900
10 2010-04-23 03:36:38 3600
11 2010-04-23 08:58:14 300
12 2010-04-24 03:21:52 900
13 2010-04-24 03:22:42 3600
14 2010-04-24 07:24:19 300
15 2010-04-24 07:55:19 900

我需要找到从 2010-04-02 00:00:00 到 2010-04-21 09:00:00 期间以及从 2010-04-23 03 期间的总持续时间(长度) :15:00 至 2010-04-24 08:00:00.

棘手的部分是给定的长度可以超过指定时间段的末尾,我不想计算那个额外的持续时间。

我希望得到:

  • 2010-04-02 00:00:00 到 2010-04-21 09:00:00 为 12428 秒
  • 2010-04-23 03:15:00 到 2010-04-24 08:00:00 为 10103 秒

我正在考虑使用 lubridate 并为每一行定义一个间隔,然后对持续时间求和,但我无法弄清楚。

最佳答案

不确定到底在问什么。另一个答案只是对指定时间间隔内的开始时间求和 length 。但是,我将这个问题解释为想要处理长度可能超过指定期间结束的事件,而不是计算超过指定期间结束的时间(反之亦然,对于期间开始之前的开始时间).例如,第 7 行在 2010-04-21 09:00:00 之后运行。这就是提供预期输出很有帮助的原因!

无论如何,这里有一种方法可以执行我认为您的意思是包装在函数中的操作。方法基本上是创建一个新的开始和结束,如果事件结束,这是指定间隔的边缘。我可能遗漏了一些边缘情况,欢迎改进!

dates<-data.frame(start=as.POSIXct(c("2010-04-03 03:02:38 UTC","2010-04-03 06:03:14 UTC","2010-04-20 03:05:52 UTC","2010-04-20 03:17:42 UTC","2010-04-21 03:09:38 UTC","2010-04-21 07:10:14 UTC","2010-04-21 08:12:52 UTC","2010-04-23 03:13:42 UTC","2010-04-23 03:25:42 UTC","2010-04-23 03:36:38 UTC","2010-04-23 08:58:14 UTC","2010-04-24 03:21:52 UTC","2010-04-24 03:22:42 UTC","2010-04-24 07:24:19 UTC","2010-04-24 07:55:19 UTC")),length=c(3600,300,900,3600,300,900,3600,300,900,3600,300,900,3600,300,900))
library(dplyr)
library(lubridate)

length_within <- function(tbl, interval_start, interval_end){
intv_start = as.POSIXct(interval_start)
intv_end = as.POSIXct(interval_end)
tbl %>%
mutate(
end = start + length,
counted_start = ifelse(start < intv_start, intv_start, start),
counted_end = ifelse(end > intv_end, intv_end, end),
seconds = counted_end - counted_start
) %>%
filter(seconds >= 0) %>%
summarise(total = sum(seconds)) %>%
`[[` (1)
}

length_within(dates,"2010-04-02 00:00:00", "2010-04-21 09:00:00")
#> [1] 12428
length_within(dates,"2010-04-23 03:15:00", "2010-04-24 08:00:00")
#> [1] 10103

关于r - 计算给定时间段内时间间隔的持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com