首页 > 解决方案 > 在R中将数据拆分为指定的时间间隔

问题描述

我发现这篇文章很有帮助,但我仍有一些问题。我正在使用df以下数据:

                  date download  
6  2018-07-10 08:57:12     1.47  
7  2018-07-10 08:59:00     0.57
8  2018-07-10 09:01:00     0.16
9  2018-07-10 09:05:11     0.08
10 2018-07-10 09:09:12     0.09
11 2018-07-10 09:13:11     0.14

我想要做的是能够根据小时将数据分成 15 分钟、30 分钟和 60 分钟的块(因此间隔将是 0:00、0:15、0:30、0:45、 0:60 如果它是基于 15 分钟的块分开的。目前我正在使用这个代码:

split(df, cut(df$date, breaks = "hour"))

在小时的情况下,哪种情况完全符合我的要求并返回以下结果:

$`2018-07-10 08:00:00`
                 date download
6 2018-07-10 08:57:12     1.47
7 2018-07-10 08:59:00     0.57

$`2018-07-10 09:00:00`
                  date download
8  2018-07-10 09:01:00     0.16
9  2018-07-10 09:05:11     0.08
10 2018-07-10 09:09:12     0.09

这正是我正在寻找的结果,因为它严格按小时(08:00-08:59、09:00-09:45 等)分隔数据。但是,当我这样做时:

split(df, cut(df$date, breaks = "30 min"))

我最终得到以下结果:

$`2018-07-10 08:57:00`
                  date download
6  2018-07-10 08:57:12     1.47
7  2018-07-10 08:59:00     0.57
8  2018-07-10 09:01:00     0.16
9  2018-07-10 09:05:11     0.08
10 2018-07-10 09:09:12     0.09
11 2018-07-10 09:13:11     0.14

虽然它按 30 分钟(或 15)间隔对其进行分组,但它在最早的时间开始该间隔,在本例中为 08:57:00,而不是从小时 (09:00:00) 开始。我怎样才能做到这一点,以便在尝试获得 15 和 30 分钟的间隔时,它们会像小时间隔一样按小时开始?

这篇文章解决了这个问题,但你最终会在时间范围内计算事件数,而且它也不是很优雅/灵活。我希望坚持使用拆分和剪切,因为我正在制作一个闪亮的应用程序,并且似乎更容易进行交互(即有一个带有间隔的下拉菜单,可以很容易地直接插入到拆分代码中)。

谢谢!

标签: r

解决方案


低于起点(必须微调边界)。

想法是生成切点:在日期(时间)上使用时,seq允许为参数指定以天、小时、分钟为单位的时间范围by

library(lubridate)
date=ymd_hms(
  c("2018-07-10 08:57:12",
    "2018-07-10 08:59:00",
    "2018-07-10 09:01:00",
    "2018-07-10 09:05:11",
    "2018-07-10 09:09:12",
    "2018-07-10 09:13:11"))
download = round(runif(length(date),min=1,max=10))
df <- data.frame(date, download)

from=round(min(df$date),"hour")-hours(1)
to=round(max(df$date),"hour")+hours(1)
breaks=seq(from, to, by="30 min")
split(df,cut(df$date, breaks))

导致

$`2018-07-10 08:00:00`
[1] date     download
<0 rows> (or 0-length row.names)

$`2018-07-10 08:30:00`
                 date download
1 2018-07-10 08:57:12        4
2 2018-07-10 08:59:00        7

$`2018-07-10 09:00:00`
                 date download
3 2018-07-10 09:01:00        5
4 2018-07-10 09:05:11        1
5 2018-07-10 09:09:12        3
6 2018-07-10 09:13:11        4

$`2018-07-10 09:30:00`
[1] date     download
<0 rows> (or 0-length row.names)

推荐阅读