7

I have database with time data. I want to interpolate the data to mach e specific time step.

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

I want to obtain data with below time step doing interpolation.

    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 ....    

I tried with diffrent method but I didn't find the solution. For example I create zoo object.

   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)

but error occur:

   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

I create a secundary index t that start where I want to have data, but I don't know how to use thid index.

Have you any suggestion?

GSee
  • 48,880
  • 13
  • 125
  • 145
Marco Giuliani
  • 241
  • 2
  • 9
  • I'm quite new, I read and I agree. bye – Marco Giuliani Dec 17 '12 at 18:27
  • Thank you. What package does `asP` come from? – GSee Dec 17 '12 at 18:30
  • It is only a fuction write by me for having claer language. I use it to easly change from character to POSIXct. function(timeVal, tz="GMT", ...) { ## For easy conversion from string or seconds since 1970-01-01 to POSIXct switch(class(timeVal[1])[1], character=as.POSIXct(timeVal,tz=tz, ...), POSIXct=timeVal, POSIXlt=timeVal, ISOdate(1970,1,1,0)+timeVal ) } – Marco Giuliani Dec 17 '12 at 18:40

3 Answers3

4

Try this (assuming your time index is 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)

See ?na.approx.zoo for more info.

Note: Since the question did not provide the data in reproducible form we do so here:

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)

giving:

                    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
G. Grothendieck
  • 254,981
  • 17
  • 203
  • 341
  • This solution is good, but you need to eliminate the time column from z if you want to make it works. thanks for suggestion – Marco Giuliani Feb 05 '13 at 14:11
  • Next time please state your question in reproducible form. In the absence of that we assumed, as stated, that the input has POSIXct time stamps. See the Note where we provide complete reproducible code. – G. Grothendieck Nov 25 '14 at 14:03
3

You can see the process as follow:

  1. Build a sequence based on the data ranges.
  2. Merge the sequence and the data.
  3. Interpolate the values: constant or linear method.

Creating the dataset:

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")

Library zoo:

library(zoo)

Step 1:

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

Step 2:

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

Step 3:

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

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

Visualizing

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 
angelous
  • 781
  • 7
  • 5
0

I can't find a function in xts package(or zoo ) that approximate the ts given dates.

So, my idea is to insert NA in the original ts , for the given dates.

 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

Now you can use na.approx or na.spline like this

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
agstudy
  • 119,832
  • 17
  • 199
  • 261