2012-12-17 43 views
7

Tôi có cơ sở dữ liệu với dữ liệu thời gian. Tôi muốn nội suy các dữ liệu để mach e bước thời gian cụ thể.Nội suy của dữ liệu chuỗi thời gian với thời gian đầu ra cụ thể

Id Time     humid humtemp prtemp press  t 
1 2012-01-21 18:41:50  47.7 14.12 13.870 1005.70  -0.05277778 
1 2012-01-21 18:46:43  44.5 15.37 15.100 1005.20  0.02861111 
1 2012-01-21 18:51:35  43.2 15.88 15.576 1005.10  0.10972222 
1 2012-01-21 18:56:28  42.5 16.17 15.833 1004.90  0.19111111 
1 2012-01-21 19:01:21  42.2 16.31 15.986 1004.80  0.27250000 
1 2012-01-21 19:06:14  41.8 16.47 16.118 1004.60  0.35388889 
1 2012-01-21 19:11:07  41.6 16.51 16.177 1004.60  0.43527778 

Tôi muốn lấy dữ liệu với bước thời gian dưới đây làm nội suy.

Id     Time  humid humtemp prtemp press  t 
    1 2012-01-21 18:45:00 .... ...  ..... ....  .... 
    1 2012-01-21 18:50:00 ....  
    1 2012-01-21 18:55:00 ....  
    1 2012-01-21 19:00:00 ....  
    1 2012-01-21 19:05:00 ....  
    1 2012-01-21 19:10:00 ....  

Tôi đã thử với phương pháp khác nhưng tôi không tìm thấy giải pháp. Ví dụ tôi tạo đối tượng sở thú.

z <- zoo(MTS01m,order.by=MTS01m$Time) 
    tstart2<-asP("2012-01-21 18:45:00") 
    Ts<-1*60 
    y <- merge(z, zoo(order.by=seq(tstart2, end(z), by=Ts))) 
    xa <- na.approx(y) 
    xs <- na.spline(y) 

nhưng lỗi xảy ra:

Errore in approx(x[!na], y[!na], xout, ...) : 
    need at least two non-NA values to interpolate 
    Inoltre: Warning message: 
    In xy.coords(x, y) : si è prodotto un NA per coercizione 

tôi tạo ra một chỉ số t secundary rằng bắt đầu từ đâu tôi muốn có dữ liệu, nhưng tôi không biết làm thế nào để sử dụng chỉ số thid.

Bạn có đề xuất nào không?

+0

Tôi đang khá mới, tôi đọc và tôi đồng ý. bye –

+0

Cảm ơn bạn. Gói 'asP' đến từ đâu? – GSee

+0

Nó chỉ là một fuction viết bởi tôi vì có ngôn ngữ claer. Tôi sử dụng nó để dễ dàng thay đổi từ nhân vật sang POSIXct. chức năng (timeVal, tz = "GMT", ...) { ## Để dễ dàng chuyển đổi từ chuỗi hoặc giây từ 1970-01-01 sang POSIXct chuyển đổi (lớp (timeVal [1]) [1], ký tự = as.POSIXct (timeVal, tz = tz, ...), POSIXct = timeVal, POSIXlt = timeVal, ISOdate (1970,1,1,0) + timeVal ) } –

Trả lời

3

Hãy thử điều này (giả sử chỉ số thời gian của bạn là POSIXct):

library(zoo) 
st <- as.POSIXct("2012-01-21 18:45") 
g <- seq(st, end(z), by = "15 min") # grid 
na.approx(z, xout = g) 

Xem ?na.approx.zoo để biết thêm i nfo.

Lưu ý: Kể từ khi câu hỏi đã không cung cấp dữ liệu ở dạng tái sản xuất chúng tôi làm như vậy ở đây:

Lines <- "Id date Time humid humtemp prtemp press t1 
1 2012-01-21 18:41:50  47.7 14.12 13.870 1005.70  -0.05277778 
1 2012-01-21 18:46:43  44.5 15.37 15.100 1005.20  0.02861111 
1 2012-01-21 18:51:35  43.2 15.88 15.576 1005.10  0.10972222 
1 2012-01-21 18:56:28  42.5 16.17 15.833 1004.90  0.19111111 
1 2012-01-21 19:01:21  42.2 16.31 15.986 1004.80  0.27250000 
1 2012-01-21 19:06:14  41.8 16.47 16.118 1004.60  0.35388889 
1 2012-01-21 19:11:07  41.6 16.51 16.177 1004.60  0.43527778" 

library(zoo) 
z <- read.zoo(text = Lines, header = TRUE, index = 2:3, tz = "") 
st <- as.POSIXct("2012-01-21 18:45") 
g <- seq(st, end(z), by = "15 min") # grid 
na.approx(z, xout = g) 

hiến:

    Id humid humtemp prtemp press   t1 
2012-01-21 18:45:00 1 45.62491 14.93058 14.66761 1005.376 -1.501706e-09 
2012-01-21 19:00:00 1 42.28294 16.27130 15.94370 1004.828 2.500000e-01 
+0

giải pháp này là tốt, nhưng bạn cần phải loại bỏ cột thời gian từ z nếu bạn muốn làm cho nó hoạt động. cảm ơn đề xuất –

+0

Lần tới, hãy nêu câu hỏi của bạn ở dạng tái sản xuất. Trong trường hợp không có chúng tôi giả định, như đã nêu, đầu vào có tem thời gian POSIXct. Xem Lưu ý nơi chúng tôi cung cấp mã có thể tái sản xuất hoàn chỉnh. –

0

Tôi không thể tìm thấy hàm trong gói xts (hoặc sở thú) gần đúng với ngày đã cho.

Vì vậy, ý tưởng của tôi là chèn NA vào ts gốc, cho các ngày đã cho.

ids <- as.POSIXct(align.time(index(dat.xts),60*5))  # range dates 
# I create an xts with NA 
y <- xts(x=matrix(data=NA,nrow=dim(dat.xts)[1], 
          ncol=dim(dat.xts)[2]), 
          order.by=ids) 
rbind(y,dat.xts) 

      humid humtemp prtemp press   t 
2012-01-21 18:41:50 47.7 14.12 13.870 1005.7 -0.05277778 
2012-01-21 18:45:00 NA  NA  NA  NA   NA 
2012-01-21 18:46:43 44.5 15.37 15.100 1005.2 0.02861111 
2012-01-21 18:50:00 NA  NA  NA  NA   NA 
2012-01-21 18:51:35 43.2 15.88 15.576 1005.1 0.10972222 
2012-01-21 18:55:00 NA  NA  NA  NA   NA 

Bây giờ bạn có thể sử dụng na.approx hoặc na.spline như thế này

na.approx(rbind(y,dat.xts))[index(y)] 
        humid humtemp prtemp press t 
2012-01-21 18:45:00 45.62 14.93 14.67 1005.38 0.00 
2012-01-21 18:50:00 43.62 15.71 15.42 1005.13 0.08 
2012-01-21 18:55:00 42.71 16.08 15.76 1004.96 0.17 
2012-01-21 19:00:00 42.28 16.27 15.94 1004.83 0.25 
2012-01-21 19:05:00 41.90 16.43 16.08 1004.65 0.33 
2012-01-21 19:10:00 41.65 16.50 16.16 1004.60 0.42 
2

Bạn có thể thấy quá trình này như sau:

  1. Tạo một chuỗi b ased trên dữ liệu phạm vi.
  2. Hợp nhất trình tự dữ liệu.
  3. Nội suy các giá trị: phương pháp hằng số hoặc tuyến tính.

Tạo tập dữ liệu:

data1 <- read.table(text="1 2012-01-21 18:41:50  47.7 14.12 13.870 1005.70  -0.05277778 
1 2012-01-21 18:46:43  44.5 15.37 15.100 1005.20  0.02861111 
1 2012-01-21 18:51:35  43.2 15.88 15.576 1005.10  0.10972222 
1 2012-01-21 18:56:28  42.5 16.17 15.833 1004.90  0.19111111 
1 2012-01-21 19:01:21  42.2 16.31 15.986 1004.80  0.27250000 
1 2012-01-21 19:06:14  41.8 16.47 16.118 1004.60  0.35388889 
1 2012-01-21 19:11:07  41.6 16.51 16.177 1004.60  0.43527778", 
col.names=c("Id","date","Time","humid","humtemp","prtemp","press","t1")) 
data1$datetime <- strptime(as.character(paste(d$date,d$Time, sep=" ")),"%Y-%m-%d %H:%M:%S") 

Thư viện zoo:

library(zoo) 

Bước 1:

# sequence interval 5 seconds 
seq1 <- zoo(order.by=(as.POSIXlt(seq(min(data1$datetime), max(data1$datetime), by=5)))) 

Bước 2:

mer1 <- merge(zoo(x=data1[4:7],order.by=data1$datetime), seq1) 

Bước 3:

#Constant interpolation 
dataC <- na.approx(mer1, method="constant") 

#Linear interpolation 
dataL <- na.approx(mer1) 

quán tưởng

head(dataC) 
        humid humtemp prtemp press 
2012-01-21 18:41:50 47.7 14.12 13.87 1005.7 
2012-01-21 18:41:55 47.7 14.12 13.87 1005.7 
2012-01-21 18:42:00 47.7 14.12 13.87 1005.7 
2012-01-21 18:42:05 47.7 14.12 13.87 1005.7 
2012-01-21 18:42:10 47.7 14.12 13.87 1005.7 
2012-01-21 18:42:15 47.7 14.12 13.87 1005.7 

head(dataL) 
         humid humtemp prtemp press 
2012-01-21 18:41:50 47.70000 14.12000 13.87000 1005.700 
2012-01-21 18:41:55 47.64539 14.14133 13.89099 1005.691 
2012-01-21 18:42:00 47.59078 14.16266 13.91198 1005.683 
2012-01-21 18:42:05 47.53618 14.18399 13.93297 1005.674 
2012-01-21 18:42:10 47.48157 14.20532 13.95396 1005.666 
2012-01-21 18:42:15 47.42696 14.22666 13.97495 1005.657 
Các vấn đề liên quan