【问题标题】:Counting number of observation within time interval统计时间间隔内的观察次数
【发布时间】:2017-05-29 09:17:19
【问题描述】:

我有strPOSIXct 的数据。 对于每个观察,我想以 6 和 24 小时的时间间隔计算在此观察之前的观察次数(时间间隔需要灵活)。

这里有一些可重现的例子:

Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-02 01:15:35")))

我想得到以下输出:

x v6 v24
1   --  --
2   1   1
3   2   2
4   1   3
5   1   4

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    可能存在更有效的方法,但这应该可行

    Dat <- data.frame(x=1:5, y=as.POSIXct(c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", 
                                        "2017-02-01 23:30:35", "2017-02-01 01:15:35")))
    
    Dat <- Dat[order(Dat[,"y"]),]
    
    require(lubridate)
    
    Dat[,"span6"] <- Dat[,"y"] - hours(6)
    Dat[,"span24"] <- Dat[,"y"] - hours(24)
    
    for(s in Dat[,"span6"]){
      Dat[which(Dat[,"span6"]==s),"v6"] <-
        nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span6"]==s),"y"]),])
    }
    for(s in Dat[,"span24"]){
      Dat[which(Dat[,"span24"]==s),"v24"] <-
        nrow(Dat[which(Dat[,"y"]>=s & Dat[,"y"]<Dat[which(Dat[,"span24"]==s),"y"]),])
    }
    Dat <- Dat[,!(names(Dat) %in% c("span6","span24"))]
    

    【讨论】:

    • 它看起来确实很笨拙,但效果很好!非常感谢。
    【解决方案2】:

    您可以尝试使用library(sqldf)。 我试着用你的数据给你一个简单的例子:

    library(sqldf)
    
    Dat <- data.frame(x=1:5, y=c("2017-02-01 16:05:35", "2017-02-01 16:15:35", "2017-02-01 18:15:37", "2017-02-01 23:30:35", "2017-02-01 01:15:35"))
    
    sqldf('select distinct count (x) as count, 
           x
           from Dat 
           where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35"
           group by x')
    

    输出如下:

      count x
    1     1 1
    2     1 2
    

    你得到一个计数有多少x值在由

    表示的范围内

    where y between "2017-02-01 16:05:35" and "2017-02-01 18:15:35"

    范围的极值包含在计数中。 是解决您问题的正确方法吗?

    【讨论】:

    • @G.Grothendieck 你试过我的代码了吗?因为我已经尝试过并编写过它,所以它可以工作!
    • @G.Grothendieck 是的,很抱歉,因为我忘记删除代码 as.POSIXct()。它只在没有 as.POSIXct() 的情况下工作
    • 它现在可以使用,但我建议在文字日期周围使用单引号,在这种情况下它也可以与 H2 后端一起使用。即使 y 是 POSIXct,它也可以与 H2 后端一起使用。
    • @LorenzoBenassi 非常感谢您的努力,但它并没有真正回答我的问题。例如,您的回答中没有提及我在问题中指定的时间间隔。
    • @staove7 您可以使用语句 between 表示输入时间间隔开始和结束的日期和时间
    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多