在R中将数据拆分为指定的时间间隔

时间:2018-07-11 15:55:10

标签: r

我发现这个post很有帮助,但我仍然有几个问题。我正在使用带有以下数据的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分钟的间隔时,它们像小时间隔一样开始于小时?

这种post可以解决这个问题,但最终会在时间范围内产生大量事件,而且也不是很优雅/灵活。我希望坚持使用分割和剪切,因为我正在制作一个闪亮的应用程序,并且似乎可以更轻松地进行交互(即具有一个下拉菜单,其中的间隔可以轻松插入分割代码中)。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

想法是生成切点:在日期(时间)上使用时,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)