2012-05-03 51 views
7

Tôi có một bất thường chuỗi thời gian (với DateTime và RainfallValue) trong một tập tin csv C:\SampleData.csv:Tạo thường xuyên 15 phút chuỗi thời gian từ bất quy tắc chuỗi thời gian


DateTime,RainInches 
1/6/2000 11:59,0 
1/6/2000 23:59,0.01 
1/7/2000 11:59,0 
1/13/2000 23:59,0 
1/14/2000 0:00,0 
1/14/2000 23:59,0 
4/14/2000 3:07,0.01 
4/14/2000 3:12,0.03 
4/14/2000 3:19,0.01 
12/31/2001 22:44,0 
12/31/2001 22:59,0.07 
12/31/2001 23:14,0 
12/31/2001 23:29,0 
12/31/2001 23:44,0.01 
12/31/2001 23:59,0.01 

Lưu ý: Các tốn nhiều thời gian không thường xuyên các bước có thể là 1 phút, 15 phút, 1 giờ, v.v. Ngoài ra, có thể có nhiều quan sát trong khoảng thời gian 15 phút mong muốn.

tôi đang cố gắng để tạo ra 15 phút chuỗi thời gian thường xuyên từ 2000/01/01 đến 2001/12/31 rằng nên xem xét như:


2000-01-01 00:15:00 0.00 
2000-01-01 00:30:00 0.00 
2000-01-01 00:45:00 0.00 
... 
2001-12-31 23:30:00 0.01 
2001-12-31 23:45:00 0.01 

Lưu ý: Các chuỗi thời gian là thường xuyên với khoảng thời gian 15 phút, điền dữ liệu còn thiếu bằng 0. Nếu có nhiều hơn một điểm dữ liệu trong khoảng thời gian 15 phút, chúng sẽ được cộng lại.

Dưới đây là là mã của tôi:


library(zoo) 
library(xts) 

filename = "C:\\SampleData.csv" 
ReadData <- read.zoo(filename, format = "%m/%d/%Y %H:%M", sep=",", tz="UTC", header=TRUE) # read .csv as a ZOO object 
RawData <- aggregate(ReadData, index(ReadData), sum) # Merge duplicate time stamps and SUM the corresponding data (CAUTION) 
RawDataSeries <- as.xts(RawData,order.by =index(RawData)) #convert to an XTS object 

RegularTimes <- seq(as.POSIXct("2000-01-01 00:00:00", tz = "UTC"), as.POSIXct("2001-12-31 23:45:00", tz = "UTC"), by = 60*15) 
BlankTimeSeries <- xts((rep(0,length(RegularTimes))),order.by = RegularTimes) 

MergedTimeSeries <- merge(RawDataSeries,BlankTimeSeries) 
TS_sum15min <- period.apply(MergedTimeSeries,endpoints(MergedTimeSeries, "minutes", 15), sum, na.rm = TRUE) 

TS_align15min <- align.time(TS_sum15min [endpoints(TS_sum15min , "minutes", 15)], n=60*15) 

Vấn đề: Thời gian đầu ra loạt TS_align15min: khối (a) đã lặp đi lặp lại của thời gian tem (b) bắt đầu (một cách bí ẩn) từ năm 1999, như sau:

 
1999-12-31 19:15:00 0 
1999-12-31 19:30:00 0 
1999-12-31 19:45:00 0 
1999-12-31 20:00:00 0 
1999-12-31 20:15:00 0 
1999-12-31 20:30:00 0 

What am I doing wrong?

Thank you for any direction!

+1

Tạo một số mã tái sản xuất cho chúng ta, dput () rất hữu ích. Cũng khai báo việc bạn sử dụng các gói đã đóng góp với thư viện hoặc yêu cầu. – mdsumner

+0

@mdsumner Cảm ơn bạn đã đề xuất. Tôi đã thêm dữ liệu mẫu có thể tái sản xuất và mã. – akashwani

+0

Không, nếu nó phụ thuộc vào một tập tin dữ liệu chúng tôi không có nó không thể tái sản xuất. Xem câu trả lời của tôi cho _random data_ với một hạt giống đã cho - làm cho nó có thể tái sản xuất. –

Trả lời

15

xts extends zoo, and zoo has extensive examples for this in its vignettes and documentation.
Here is a worked example. I think I have done that more elegantly in the past, but this is all I am coming up with now:

R> twohours <- ISOdatetime(2012,05,02,9,0,0) + seq(0:7)*15*60 
R> twohours 
[1] "2012-05-02 09:15:00 GMT" "2012-05-02 09:30:00 GMT" 
[3] "2012-05-02 09:45:00 GMT" "2012-05-02 10:00:00 GMT" 
[5] "2012-05-02 10:15:00 GMT" "2012-05-02 10:30:00 GMT" 
[7] "2012-05-02 10:45:00 GMT" "2012-05-02 11:00:00 GMT" 
R> set.seed(42) 
R> observation <- xts(1:10, order.by=twohours[1]+cumsum(runif(10)*60*10)) 
R> observation 
          [,1] 
2012-05-02 09:24:08.883625 1 
2012-05-02 09:33:31.128874 2 
2012-05-02 09:36:22.812594 3 
2012-05-02 09:44:41.081170 4 
2012-05-02 09:51:06.128481 5 
2012-05-02 09:56:17.586051 6 
2012-05-02 10:03:39.539040 7 
2012-05-02 10:05:00.338998 8 
2012-05-02 10:11:34.534372 9 
2012-05-02 10:18:37.573243 10 

A two hour time grid, and some random observations leaving some cells empty and some filled.

R> to.minutes15(observation)[,4] 
          observation.Close 
2012-05-02 09:24:08.883625     1 
2012-05-02 09:44:41.081170     4 
2012-05-02 09:56:17.586051     6 
2012-05-02 10:11:34.534372     9 
2012-05-02 10:18:37.573243    10 

That is a 15 minutes grid aggregation but not on our time grid.

R> twoh <- xts(rep(NA,8), order.by=twohours) 
R> twoh 
        [,1] 
2012-05-02 09:15:00 NA 
2012-05-02 09:30:00 NA 
2012-05-02 09:45:00 NA 
2012-05-02 10:00:00 NA 
2012-05-02 10:15:00 NA 
2012-05-02 10:30:00 NA 
2012-05-02 10:45:00 NA 
2012-05-02 11:00:00 NA 

R> merge(twoh, observation) 
          twoh observation 
2012-05-02 09:15:00.000000 NA   NA 
2012-05-02 09:24:08.883625 NA   1 
2012-05-02 09:30:00.000000 NA   NA 
2012-05-02 09:33:31.128874 NA   2 
2012-05-02 09:36:22.812594 NA   3 
2012-05-02 09:44:41.081170 NA   4 
2012-05-02 09:45:00.000000 NA   NA 
2012-05-02 09:51:06.128481 NA   5 
2012-05-02 09:56:17.586051 NA   6 
2012-05-02 10:00:00.000000 NA   NA 
2012-05-02 10:03:39.539040 NA   7 
2012-05-02 10:05:00.338998 NA   8 
2012-05-02 10:11:34.534372 NA   9 
2012-05-02 10:15:00.000000 NA   NA 
2012-05-02 10:18:37.573243 NA   10 
2012-05-02 10:30:00.000000 NA   NA 
2012-05-02 10:45:00.000000 NA   NA 
2012-05-02 11:00:00.000000 NA   NA 

New xts object, and merged object. Now use na.locf() để thực hiện những quan sát về phía trước:

R> na.locf(merge(twoh, observation)[,2]) 
          observation 
2012-05-02 09:15:00.000000   NA 
2012-05-02 09:24:08.883625   1 
2012-05-02 09:30:00.000000   1 
2012-05-02 09:33:31.128874   2 
2012-05-02 09:36:22.812594   3 
2012-05-02 09:44:41.081170   4 
2012-05-02 09:45:00.000000   4 
2012-05-02 09:51:06.128481   5 
2012-05-02 09:56:17.586051   6 
2012-05-02 10:00:00.000000   6 
2012-05-02 10:03:39.539040   7 
2012-05-02 10:05:00.338998   8 
2012-05-02 10:11:34.534372   9 
2012-05-02 10:15:00.000000   9 
2012-05-02 10:18:37.573243   10 
2012-05-02 10:30:00.000000   10 
2012-05-02 10:45:00.000000   10 
2012-05-02 11:00:00.000000   10 

Và sau đó chúng ta có thể kết hợp lại như một tham gia bên trên thời gian lưới XTS twoh:

R> merge(twoh, na.locf(merge(twoh, observation)[,2]), join="inner")[,2] 
        observation 
2012-05-02 09:15:00   NA 
2012-05-02 09:30:00   1 
2012-05-02 09:45:00   4 
2012-05-02 10:00:00   6 
2012-05-02 10:15:00   9 
2012-05-02 10:30:00   10 
2012-05-02 10:45:00   10 
2012-05-02 11:00:00   10 
R> 
+0

Cảm ơn bạn! Nó có vẻ tốt. Hãy để tôi chuyển đổi mã của tôi để làm theo điều này và lấy lại. Tôi cũng đã thay đổi bài đăng gốc của mình để bao gồm dữ liệu mẫu và dữ liệu mẫu có thể tái sản xuất. – akashwani

+5

Về sự thanh lịch: bạn không cần đối tượng 'haih'. Bạn có thể kết hợp 'quan sát' với một đối tượng xts" rỗng "(' xts (, haihours) '), sử dụng' na.locf' trên đó, sau đó tập hợp con với 'haihours'. Hoặc, trong một dòng: 'na.locf (hợp nhất (xts (, hai giờ), quan sát)) [hai giờ]'. –

+0

Tôi cũng đã làm theo cách này (bằng cách sử dụng 'chỉ số (haih)', nhưng kết thúc với các lỗi với stumped tôi. Tốt để xem tôi đã đi đúng ... –

3

Dưới đây là một giải pháp data.table, điều này có thể được gọn gàng thực hiện bằng một cán tham gia:

library(data.table) 
library(xts) 

lu <- data.table(index=as.POSIXct("2012-05-02") + (0:7)*15*60) 

observation <- xts(1:10, 
        order.by=lu[1,index +cumsum(runif(10)*60*10)]) 

observation.dt <- as.data.table(observation) 
observation.dt[lu,on="index",roll=T] 
Các vấn đề liên quan