Как группировать / суммировать временные ряды xts по целым секундам - PullRequest
0 голосов
/ 04 декабря 2018

Любой пакет может сделать следующий пример?У меня большой xts набор данных в миллисекундном уровне.
Можно ли суммировать coredata до второго уровня?
Время - индекс.

Например:

enter image description here

Идеальный результат:

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018
library(xts)

# To see subsecond timestamp values:
options(digits.secs = 3)

set.seed(1)
x <- xts(rnorm(10), as.POSIXct("2018-11-01 00:00:00.3") + seq(0.05, 3, length.out = 10))
# [,1]
# 2018-11-01 00:00:00.349 -0.6264538
# 2018-11-01 00:00:00.677  0.1836433
# 2018-11-01 00:00:01.005 -0.8356286
# 2018-11-01 00:00:01.333  1.5952808
# 2018-11-01 00:00:01.661  0.3295078
# 2018-11-01 00:00:01.988 -0.8204684
# 2018-11-01 00:00:02.316  0.4874291
# 2018-11-01 00:00:02.644  0.7383247
# 2018-11-01 00:00:02.972  0.5757814
# 2018-11-01 00:00:03.299 -0.3053884

Для суммирования значений в секундах вы можете использовать xts's period.apply в сочетании с поиском индекса последнего наблюдения в течение каждой секунды, используя xts's endpoints:

ep <- endpoints(x, on = "seconds", k = 1)

xs <- period.apply(x, ep, sum)

"целомВторые "временные метки могут быть нежелательны, которые вы можете затем исправить, используя xts's align.time, который округляет до конца секунды (важно округлить до конца секунды, чтобы избежать смещения ожидающих данных в ваших данных)

xs
#                               [,1]
# 2018-11-01 00:00:00.677 -0.4428105
# 2018-11-01 00:00:01.988  0.2686916
# 2018-11-01 00:00:02.972  1.8015351
# 2018-11-01 00:00:03.299 -0.3053884

xs <- align.time(xs, n = 1)
xs
#                           [,1]
# 2018-11-01 00:00:01 -0.4428105
# 2018-11-01 00:00:02  0.2686916
# 2018-11-01 00:00:03  1.8015351
# 2018-11-01 00:00:04 -0.3053884
0 голосов
/ 04 декабря 2018

Вы можете агрегировать, используя aggregate.zoo() из пакета zoo.

library(xts)
library(zoo)

# A simple example time series
xx <- xts(1:20, as.POSIXct((1:20)/5, origin="2000-01-01"))

aggregate(xx, as.POSIXct(trunc(time(xx), "sec")), sum)

# 2000-01-01 01:00:00 10
# 2000-01-01 01:00:01 35
# 2000-01-01 01:00:02 60
# 2000-01-01 01:00:03 85
# 2000-01-01 01:00:04 20
...