Як зробити повторну вибірку часового ряду 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

Це саме те, чого я не хочу - буду залежним від першого пункту
Меха

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 після використання кінцевих точок - це те, чого хотів Адал (крім того, що стосується його згадки про взяття «попереднього» в оригінальному запитанні). У всякому разі, це те, чого я хотів, тому дякую Джошуа.
Рахул Савані

Чи є версія align.time, але щоб її закріпити, а не вгору? Це також робить саме те, що я хочу, але для цього. (До речі, у мене є непростий спосіб: якщо a1 - це мій XTS-об’єкт, і я хочу округлити до хвилинних інтервалів, то index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook

1
@DarrenCook: Немає версії, align.timeяка це робить. Незважаючи на це , схоже , погану ідею , щоб вирівняти спостереження з часом попереднього їх виникнення.
Джошуа Ульріх

2
@JoshuaUlrich Одним із прикладів є перетворення фінансових тиків у бар. 08:00 представляє хвилину з 08: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)}

(я пішов із останнім вибором у власному сценарії.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.