Как повторно сэмплировать временной ряд XTS в R?

9

У меня нерегулярно разнесенный XTSвременной ряд (со POSIXctзначениями в качестве типа индекса).

Как я могу построить новый временной ряд, выбранный, скажем, с 10-минутным интервалом, но с каждым моментом выборки, выровненным по времени раунда (13:00:00, 13:10:00, 13:20:00, ...) , Если момент пересэмплирования не попадает точно в исходное значение серии, я хочу взять предыдущий.

Мех
источник
Не могли бы вы привести пример?
Джошуа Ульрих
2
Если бы был список часто задаваемых вопросов для xts, это было бы очень высоко. Пожалуйста, посмотрите здесь, ищите [r] xtsи просматривайте архивы r-sig-finance.
Дирк Эддельбюттель

Ответы:

5
library(xts)
?endpoints

Например

tmp=zoo(rnorm(1000), as.POSIXct("2010-02-1")+(1:1000)*60)
tmp[endpoints(tmp, "minutes", 20)]

отбирать каждые 20 минут. Вы также можете проверить to.minutes, to.dailyи т.д.

Доктор г
источник
Есть только небольшая проблема - если у меня есть ..., 14:59, 15:00, ..., он получит 14:59, а не 15:00, как мне хотелось бы. Есть ли способ заставить его вернуться 15:00? Я пытался что-то вроде "seconds", 3601, но это не работает
Мех
Поскольку временные метки являются нерегулярными, можно гарантировать только dt между точками данных. Фактические точки зависят от начальной точки серии. Если вы установите начальную точку на раунд, она будет вести себя так, как вам нравится ... (при условии, что у вас есть очки каждые N минут)
д-р G
Это именно то, чего я не хочу - быть зависимым от первого пункта
Meh
2

Я все еще не уверен, что вы пытаетесь сделать, и я все еще думаю, что пример поможет, но я подумал, что думаю, что вас это может заинтересовать align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Джошуа Ульрих
источник
Рассмотрим любой временной ряд - наружную температуру. Я хочу знать, какая температура в 11:00 на настенных часах, в 12:00 на настенных часах ... Я проверю ваш пример позже, чтобы увидеть, так ли это
Мех
Насколько я могу судить, это применение align.time после использования конечных точек - это то, что хотел Adal (не считая упоминания о том, чтобы взять «предыдущий» в первоначальном вопросе). Во всяком случае, это то, что я хотел, так что спасибо, Джошуа.
Рахул Савани
Есть ли версия align.time, но чтобы округлить, а не вверх? Это также делает именно то, что я хочу, но для этого. (Кстати, у меня есть грубый способ: если a1 - мой объект XTS, и я хочу округлить до минутных интервалов, то index(a1)=index(a1)-60;align.time(a1,60))
Даррен Кук
1
@DarrenCook: Там нет версии, align.timeкоторая делает это. Несмотря на это, кажется плохой идеей сопоставить наблюдения со временем до их появления.
Джошуа Ульрих
2
@JoshuaUlrich Одним из примеров является преобразование финансовых тиков в бар. 08:00 представляет минуты с 08:00:00 до 08:00:59. 08:00 в виде часового бара означает с 08:00:00 до 08:59:59. (Тогда это согласуется с тем, как работают дневные бары, где 2011-11-25 представляет торговлю на 2011-11-25, а не 2011-11-24.) Я думаю, что это было то же поведение, которое хотел ОП.
Даррен Кук
1

Если aявляется объектом xts с записями во втором разрешении, это сбивает все секунды: index (a) = trunc (index (a), "mins")

Вы также можете использовать это, чтобы округлить до разрешения «часов» тоже. Но 10 минут не поддерживается. Для этого вы должны сделать это:

x=as.POSIXlt(index(a))
x$sec[]=0;x$min[]=x$min[]%/%10
index(a)=x

Или a=align.time.down(a,600)где вы определили:

align.time.down=function(x,n){index(x)=index(x)-n;align.time(x,n)}

(У меня был последний выбор в моем собственном сценарии.)

Даррен Кук
источник