我根据对特定服务的请求选择了分散的时间戳数据。此数据涵盖了针对此服务的大约3。5 - 4年的请求。
我希望将这个可变间隔时间戳的选择转换为R中的频率分级时间序列。
我如何将这些时间戳转换为频率分级时间序列,例如“当天下午1点到1点15分之间,有7个请求,下午1点15分到1点30分之间有2个,在1:30到1:45之间,有0“,肯定还有一个没有任何东西的垃圾箱?
数据只是来自数据库转储的时间戳的向量,所有格式都是:“”2014-02-17 13:10:46“。只是一个大的ol'向量,其中有大约200万个对象。< / p>
答案 0 :(得分:1)
您可以使用工具处理来自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