【问题标题】:Aggregate hours & minutes by day?每天汇总小时和分钟?
【发布时间】:2016-08-27 09:34:03
【问题描述】:

我有一个具有以下形状的数据集:

2016-04-14 23:13:33
2016-04-14 23:18:37
2016-04-15 00:32:24
2016-04-15 00:33:11
2016-04-15 00:33:20

我想做的是以 15 分钟的间隔和每天对数据进行分组,所以它看起来像:

Date                          Count
2016-04-14  23:00-23.15        27
       .                       . 
2016-04-15  00:00 - 00:15      41

所以 count 变量只会计算该区间内有多少个观察值。

更新:

我删除了我的代码,因为我认为答案令人困惑。那么,您将如何以 15 分钟的间隔对这些数据进行分组以保留天数?这是我的意思的一个例子:

Date                          count
2016-05-01 23:45 - 23:59       19
2016-05-02 00:00 - 00:14       276 
2016-05-02 00:15 - 00:29       328
2016-05-02 00:30 - 00:44       244

有什么建议可以按天分解这些“计数”数据吗?

谢谢!

【问题讨论】:

  • 为什么不创建另一列以一天中的分钟数 (60x24) 为间隔?
  • 您可以使用 cut(denshours$Var1, breaks="day") 重新剪切数据。
  • 我确定我必须在第 4 行创建 hourmessages 数据框后编写一些代码,因为那时我有按小时和天汇集的数据,但我想创建这些 15 分钟箱子也保存着日子。

标签: r date time


【解决方案1】:

POSIXct 变量hourmessages$date 包含有关日期和时间的信息,因此您只需按日期而不是按时间分组。这是修改后的代码。

messages <- data.frame(created_at = c('2016-04-14 23:13:33','2016-04-14 23:18:37','2016-04-15 00:32:24','2016-04-15 00:33:11','2016-04-15 00:33:20')
)

messages$created_at <- strptime(messages$created_at,"%Y-%m-%d %H:%M:%S")
messages$created_at[1]
hourmessages <- data.frame(
    date=messages$created_at,
    time=format(messages$created_at, "%H:%M")
)

denshours <- with( hourmessages, table(hourmessages$date)) #Replaced 'time' with 'date'
denshours <- as.data.frame(denshours)

denshours$Var1 <- strptime(denshours$Var1,"%Y-%m-%d %H:%M") #Corrected date formatting
denshours$Var1 = cut(denshours$Var1, breaks="15 min")


dat.summary = aggregate(denshours$Freq ~ denshours$Var1, FUN=sum,    data=denshours)
colnames(dat.summary)[1] <- "time"
colnames(dat.summary)[2] <- "count"

更新:根据您对问题的更新,您似乎想将日期缩短为“不错”的休息时间,例如 00:00、15:00,而不是从这样的时间开始13:00。 R 使用第一个数据点来确定日期中断,从而确定复杂性。相反,您可以利用 POSIXct 对象实际上是数字的事实,并像这样获得汇总表:

messages <- data.frame(created_at = c('2016-04-14 23:13:33','2016-04-14 23:18:37','2016-04-15 00:32:24','2016-04-15 00:33:11','2016-04-15 00:33:20')
)

messages$created_at <- strptime(messages$created_at,"%Y-%m-%d %H:%M:%S")

#This following line defines 15 minute breaks. If needed, you can replace 60*15 with the number of seconds for which you want your breaks to be defined.
messages$created_at_breaks <- as.POSIXct(floor(as.numeric(messages$created_at)/(60*15))*60*15,origin = '1970-01-01')

dat.summary <- data.frame(table(messages$created_at_breaks))

【讨论】:

  • 感谢您的回答!它类似于这个东西,但它不起作用。我想这与之前在第 3 行中安排数据有关。
  • 更新了我的答案以说明“不错”的休息时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2021-06-02
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
相关资源
最近更新 更多