Làm cách nào để lấy mẫu lại chuỗi thời gian XTS trong R?


9

Tôi có một XTSchuỗi thời gian cách đều nhau (với POSIXctcác giá trị là loại chỉ mục).

Làm cách nào tôi có thể tạo một chuỗi thời gian mới được lấy mẫu trong khoảng thời gian 10 phút, nhưng với mỗi khoảnh khắc mẫu được căn chỉnh theo thời gian tròn (13:00:00, 13:10:00, 13:20:00, ...) . Nếu một khoảnh khắc lấy mẫu lại không rơi chính xác vào giá trị sê-ri gốc, tôi muốn lấy giá trị trước đó.


Bạn có thể cung cấp một ví dụ?
Joshua Ulrich

2
Nếu đã từng có một danh sách FAQ cho xts, điều này sẽ đạt điểm cao. Xin vui lòng xem xung quanh đây, tìm kiếm [r] xtsvà xem qua các tài liệu lưu trữ r-sig-finance.
Dirk Eddelbuettel

Câu trả lời:


5
library(xts)
?endpoints

Ví dụ

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

để mẫu phụ cứ sau 20 phút. Bạn cũng có thể muốn kiểm tra to.minutes, to.dailyvv


Chỉ có một vấn đề nhỏ - nếu tôi có ..., 14:59, 15:00, ..., nó sẽ truy xuất 14:59 chứ không phải 15:00 như tôi muốn. Có cách nào để làm cho nó trở lại 15:00? Tôi đã thử một cái gì đó như thế "seconds", 3601, nhưng nó không hoạt động
Meh

Vì dấu thời gian không đều nên người ta chỉ có thể đảm bảo về dt giữa các điểm dữ liệu. Các điểm thực tế phụ thuộc vào điểm bắt đầu của chuỗi. Nếu bạn sửa điểm bắt đầu của mình thành một giờ, nó sẽ hoạt động như bạn muốn ... (giả sử bạn có điểm mỗi N phút)
Dr G

Đây chính xác là những gì tôi không muốn - bị phụ thuộc vào điểm đầu tiên
Meh

2

Tôi vẫn không chắc chắn những gì bạn đang cố gắng làm và tôi vẫn nghĩ một ví dụ sẽ giúp ích, nhưng tôi nghĩ tôi đoán rằng bạn có thể quan tâm align.time.

# Compare this:
tmp[endpoints(tmp, "minutes", 20)]
# with this:
align.time( tmp[endpoints(tmp, "minutes", 20)], n=60*20 )

Xem xét bất kỳ chuỗi thời gian - nhiệt độ bên ngoài. Tôi muốn biết nhiệt độ lúc 11:00 đồng hồ treo tường, lúc 12:00 đồng hồ treo tường, .... Tôi sẽ kiểm tra ví dụ của bạn sau để xem nó có làm điều này không
Meh

Theo như tôi có thể nói, ứng dụng này của align.time sau khi sử dụng thiết bị đầu cuối là điều Adal muốn (ngoài việc ông đề cập đến việc lấy "cái trước" trong câu hỏi ban đầu). Dù sao, đó là những gì tôi muốn, vì vậy cảm ơn, Joshua.
Rahul Savani

Có phiên bản của align.time nhưng để làm tròn xuống, không lên? Nó cũng làm chính xác những gì tôi muốn nhưng cho điều đó. (BTW, tôi có một cách thô thiển: nếu a1 là đối tượng XTS của tôi và tôi muốn làm tròn xuống các khoảng thời gian, sau đó index(a1)=index(a1)-60;align.time(a1,60))
Darren Cook

1
@DarrenCook: Không có phiên bản align.timenào làm được điều đó. Bất kể, có vẻ như một ý tưởng tồi để sắp xếp các quan sát với một thời gian trước khi chúng xảy ra.
Joshua Ulrich

2
@JoshuaUlrich Một ví dụ là chuyển đổi các dấu tick tài chính sang một thanh. 08:00 đại diện cho phút từ 08:00:00 đến 08:00:59. 08:00 như một thanh giờ biểu thị 08:00:00 đến 08:59:59. (Sau đó, nó phù hợp với cách thức hoạt động của các thanh hàng ngày, trong đó 2011-11-25 đại diện cho giao dịch vào ngày 2011-11-25 chứ không phải vào ngày 2011-11-24.) Tôi nghĩ rằng đây là hành vi tương tự mà OP muốn.
Darren Cook

1

Nếu alà một đối tượng xts có các mục đến độ phân giải thứ hai, điều này sẽ loại bỏ tất cả các giây: index (a) = trunc (index (a), "phút")

Bạn cũng có thể sử dụng điều này để làm tròn độ phân giải "giờ". Nhưng 10 phút không được hỗ trợ. Cho rằng bạn phải làm điều này:

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

Hoặc a=align.time.down(a,600)nơi bạn đã xác định:

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

(đã đi với lựa chọn cuối cùng đó trong kịch bản của riêng tôi.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.