Bagaimana sampel ulang seri waktu XTS dalam R?

9

Saya memiliki XTSderet waktu yang tidak beraturan (dengan POSIXctnilai sebagai tipe indeks).

Bagaimana saya bisa membuat rangkaian waktu baru yang disampel pada katakanlah interval 10 menit, tetapi dengan setiap momen sampel disejajarkan dengan waktu putaran (13:00:00, 13:10:00, 13:20:00, ...) . Jika saat resampling tidak jatuh tepat pada nilai seri asli, saya ingin mengambil yang sebelumnya.

Ah
sumber
Bisakah Anda memberikan contoh?
Joshua Ulrich
2
Jika ada daftar FAQ untuk xts, ini akan mendapat skor tinggi. Silakan lihat di sekitar sini, cari [r] xtsdan telusuri arsip r-sig-finance.
Dirk Eddelbuettel

Jawaban:

5
library(xts)
?endpoints

Contohnya

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

untuk subsampel setiap 20 menit. Anda mungkin juga ingin memeriksa to.minutes, to.dailydll

Dr G
sumber
Hanya ada masalah kecil - jika saya punya ..., 14:59, 15:00, ..., itu akan mengambil 14:59 dan bukan 15:00 seperti yang saya inginkan. Apakah ada cara untuk mengembalikannya jam 15:00? Aku mencoba sesuatu seperti "seconds", 3601, tetapi tidak bekerja
Meh
Karena stempel waktu tidak teratur, maka hanya dapat membuat jaminan pada dt antara titik data. Poin aktual tergantung pada titik awal seri. Jika Anda memperbaiki titik awal Anda menjadi satu jam bulat, itu akan berperilaku seperti yang Anda suka ... (dengan asumsi Anda memiliki poin setiap N menit)
Dr G
Inilah tepatnya yang tidak saya inginkan - menjadi tergantung pada poin pertama
Meh
2

Saya masih tidak yakin apa yang Anda coba lakukan dan saya masih berpikir contoh akan membantu, tapi saya pikir saya rasa Anda mungkin tertarik align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )
Joshua Ulrich
sumber
Pertimbangkan deret waktu - suhu luar. Saya ingin tahu apa suhunya pukul 11.00 jam dinding, jam 12.00 dinding, .... Saya akan memeriksa contoh Anda nanti untuk melihat apakah hal ini terjadi
Meh
Sejauh yang saya tahu, aplikasi align.time ini setelah menggunakan titik akhir adalah apa yang diinginkan Adal (terlepas dari tentang penyebutannya tentang mengambil "yang sebelumnya" dalam pertanyaan awal). Bagaimanapun, itu yang saya inginkan, jadi terima kasih, Joshua.
Rahul Savani
Apakah ada versi align.time tetapi untuk dibulatkan, tidak naik? Itu juga melakukan persis apa yang saya inginkan tetapi untuk itu. (BTW, saya punya cara kasar: jika a1 adalah objek XTS saya dan saya ingin membulatkan ke interval menit, kemudian index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook
1
@ DarrenCook: Tidak ada versi align.timeyang melakukan itu. Bagaimanapun, sepertinya ide yang buruk untuk menyelaraskan pengamatan dengan waktu sebelum terjadinya.
Joshua Ulrich
2
@JoshuaUlrich Salah satu contohnya adalah mengubah tanda centang finansial menjadi bilah. 08:00 mewakili menit dari 08:00 - 08:00:59. 08:00 sebagai bar jam mewakili 08:00:00 sampai 08:59:59. (Ini kemudian konsisten dengan cara kerja bar harian, di mana 2011-11-25 mewakili perdagangan pada 2011-11-25 bukan pada 2011-11-24). Saya pikir ini adalah perilaku yang sama yang diinginkan OP.
Darren Cook
1

Jika aobjek xts dengan entri ke resolusi kedua, ini mematikan semua detik: indeks (a) = trunc (indeks (a), "menit")

Anda juga dapat menggunakan ini untuk membulatkan ke resolusi "jam" juga. Tetapi 10 menit tidak didukung. Untuk itu Anda harus melakukan ini:

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

Atau di a=align.time.down(a,600)mana Anda telah mendefinisikan:

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

(Sudah pergi dengan pilihan terakhir dalam skrip saya sendiri.)

Darren Cook
sumber