代码之家  ›  专栏  ›  技术社区  ›  Harold Schreckengost

将时间戳转换为R中的频率装箱时间序列?

  •  -1
  • Harold Schreckengost  · 技术社区  · 7 年前

    我根据对特定服务的请求选择了一些分散的时间戳数据。该数据涵盖了大约3.5-4年针对该服务的请求。

    我希望将这种可变间隔时间戳的选择转换为R中的频率组合时间序列。

    我该如何将这些时间戳转换为频率组合的时间序列,例如“今天下午1点到1点15分之间,有7个请求,下午1点15到1点30分之间有2个,1点30到1点45分之间有0个”,确保也有一个没有的箱子?

    数据只是来自数据库转储的时间戳向量,所有格式为:“2014-02-17 13:10:46”。只是一个包含约200万对象的大ol向量。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ralf Stubner    7 年前

    您可以使用工具处理来自 xts zoo . 请注意,您将需要一些人工“数据”:

    library(xts)
    set.seed(42)
    ts.index <- ISOdatetime(2018, 1, 8, 8:9, sample(60, 10), 0)
    ts <- xts(rep(1, length(ts.index)), ts.index)
    aggregate(ts, time(ts) - as.numeric(time(ts)) %% 900, length, regular = TRUE)
    #>                      
    #> 2018-01-08 08:15:00 1
    #> 2018-01-08 08:30:00 3
    #> 2018-01-08 08:45:00 1
    #> 2018-01-08 09:00:00 1
    #> 2018-01-08 09:15:00 1
    #> 2018-01-08 09:45:00 3
    

    编辑: 如果要包含没有观测值的箱子,可以将其转换为严格规则的 ts 对象并替换插入的 NA 带零的值:

    raw <- aggregate(ts, time(ts) - as.numeric(time(ts)) %% 900, length, regular = TRUE)
    as.xts(na.fill(as.ts(raw), 0), dateFormat = "POSIXct")
    #>                     zoo(coredata(x), tt)
    #> 2018-01-08 08:15:00                    1
    #> 2018-01-08 08:30:00                    3
    #> 2018-01-08 08:45:00                    1
    #> 2018-01-08 09:00:00                    1
    #> 2018-01-08 09:15:00                    1
    #> 2018-01-08 09:30:00                    0
    #> 2018-01-08 09:45:00                    3
    

    编辑2: 它还适用于提供的示例数据:

    library(xts)
    data <- c(1228917812, 1245038910, 1245986979, 1268750482, 1281615510, 1292561113)
    class(data) = c("POSIXct", "POSIXt")
    attr(data, "tzone") <- "UTC"
    dput(data)
    #> structure(c(1228917812, 1245038910, 1245986979, 1268750482, 1281615510, 
    #> 1292561113), class = c("POSIXct", "POSIXt"), tzone = "UTC")
    ts <- xts(rep(1, length(data)), data)
    raw <- aggregate(ts, time(ts) - as.numeric(time(ts)) %% 900, length, regular = TRUE)
    head(as.xts(na.fill(as.ts(raw), 0), dateFormat = "POSIXct"))
    #>                     zoo(coredata(x), tt)
    #> 2008-12-10 15:00:00                    1
    #> 2008-12-10 15:15:00                    0
    #> 2008-12-10 15:30:00                    0
    #> 2008-12-10 15:45:00                    0
    #> 2008-12-10 16:00:00                    0
    #> 2008-12-10 16:15:00                    0