【问题标题】:Convert timestamps to frequency-binned timeseries in R?将时间戳转换为 R 中的频率分级时间序列?
【发布时间】:2018-06-17 02:37:51
【问题描述】:

我根据对特定服务的请求选择了分散的时间戳数据。此数据涵盖了大约 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 万个对象的大向量。

【问题讨论】:

  • 请分享您的数据样例。只需在问题描述中分享dput(head(data)) 的输出即可。
  • 数据实际上只是从我们的数据库中提取的一堆(我的意思是一堆)时间戳的向量。所以看起来像几百万点这种格式:“2014-02-17 13:10:46”。

标签: r time-series aggregation


【解决方案1】:

您可以使用工具来处理来自xtszoo 的时间序列数据。请注意,您将需要一些人工“数据”:

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

编辑:如果您想在没有观察的情况下包含 bin,您可以转换为严格常规的 ts 对象并将插入的 NAvalues 替换为零:

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

【讨论】:

  • 有没有办法告诉它也包括“0”箱?
  • 当我尝试运行聚合时,它失败并出现错误:Aggregate.data.frame(as.data.frame(x), ...) 中的错误:'by' 必须是一个列表
  • @HaroldSchreckengost 请提供minimal, reproducible example 来显示问题。
  • 当我运行 dput(head(ts)) 时,结果如下: structure(c(1228917812, 1245038910, 1245986979, 1268750482, 1281615510, 1292561113), class= c("POSIXt", " "), tzone = "UTC") 如果我运行你上面给出的命令,它会给出上述错误。
  • @HaroldSchreckengost 我无法重现该错误。请参阅我的最小示例的编辑答案。我的示例适用于您的机器吗?如果是这样,您可以扩展它(可能通过添加更多数据)直到它显示错误。提示:reprex 包可以轻松生成最小的工作示例。
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 2013-11-13
  • 2017-12-03
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多