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