首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"POSIXct“"POSIXt”统计

"POSIXct“"POSIXt”统计
EN

Stack Overflow用户
提问于 2016-03-16 06:11:06
回答 3查看 82关注 0票数 1

我有以下数据结构:

代码语言:javascript
复制
myDF <- data.frame(as.POSIXct(c("2010-02-16 12:45:37 CST", 
                                "2010-02-16 13:22:23 CST", 
                                "2010-02-16 13:49:47 CST", 
                                "2010-02-16 14:23:13 CST", 
                                "2010-02-16 16:29:17 CST",
                                "2010-02-16 16:49:26 CST")))
colnames(myDF) <- c("DateTimeArrival")

如何获取12:00:00到12:59:59之间发生的事件数量。我希望得到以下结果:

代码语言:javascript
复制
Time       Number
12:59:59   1
13:59:59   1
14:59:59   1
15:59:59   0
16:59:59   2
EN

回答 3

Stack Overflow用户

发布于 2016-03-16 10:38:10

我们也可以使用library(data.table)中的foverlaps

代码语言:javascript
复制
library(data.table)

## create table of intervals
dt_intervals <- data.table(start_interval = seq(as.POSIXct("2010-02-16 11:00:00"), as.POSIXct("2010-02-16 17:00:00"), by="hour"),
                           end_interval = seq(as.POSIXct("2010-02-16 11:59:59"), as.POSIXct("2010-02-16 17:59:59"), by="hour"))

## set our df to a data.table
myDT <- data.table(myDF)
myDT[, DateTimeArrival_copy := DateTimeArrival]

setkey(dt_intervals, start_interval, end_interval)
setkey(myDT, DateTimeArrival, DateTimeArrival_copy)

foverlaps(dt_intervals,
          myDT,
         type="any")[, sum(!is.na(DateTimeArrival)), by=end_interval]

#          end_interval V1
#1: 2010-02-16 11:59:59  0
#2: 2010-02-16 12:59:59  1
#3: 2010-02-16 13:59:59  2
#4: 2010-02-16 14:59:59  1
#5: 2010-02-16 15:59:59  0
#6: 2010-02-16 16:59:59  2
#7: 2010-02-16 17:59:59  0
票数 2
EN

Stack Overflow用户

发布于 2016-03-17 02:29:35

这是另一个使用cuttable的解决方案

代码语言:javascript
复制
> as.data.frame(table(cut(myDF$DateTimeArrival+3600,
  breaks=seq(as.POSIXct("2010-02-16 11:59:59 PST"),
  by="1 hour", length.out=7))))
                 Var1 Freq
1 2010-02-16 11:59:59    0
2 2010-02-16 12:59:59    1
3 2010-02-16 13:59:59    2
4 2010-02-16 14:59:59    1
5 2010-02-16 15:59:59    0
6 2010-02-16 16:59:59    2

由于11:59到12:59的默认编码为11:59,但您希望将其编码为12:59,因此我在所有时间中添加了3600 (1小时)。

票数 2
EN

Stack Overflow用户

发布于 2016-03-16 07:24:30

使用trunc将日期/时间切回到小时,然后使用aggregate

代码语言:javascript
复制
trtimes <- as.POSIXct(trunc(myDF$DateTimeArrival, units="hours")) + 3599

aggregate(
  Count ~ Time,
  merge(
    list(Time=seq(min(trtimes), max(trtimes), by="hour")),
    list(Time=trtimes, Count=1),
    all.x=TRUE
  ),
  FUN=sum, 
  na.rm=TRUE,
  na.action=na.pass
)

#                 Time Count
#1 2010-02-16 12:59:59     1
#2 2010-02-16 13:59:59     2
#3 2010-02-16 14:59:59     1
#4 2010-02-16 15:59:59     0
#5 2010-02-16 16:59:59     2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36023216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档