Creating regular 15-minute time-series from irregular time-series

后端 未结 2 1226
说谎
说谎 2020-11-30 01:35

I have an irregular time-series (with DateTime and RainfallValue) in a csv file C:\\SampleData.csv:


DateTime,RainInches
1/6/2000 11:59,0
1/6/20         


        
相关标签:
2条回答
  • 2020-11-30 01:51

    Here is a data.table solution, this can be neatly done using a rolling join:

    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]
    
    0 讨论(0)
  • 2020-11-30 02:02

    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() to carry the observations forward:

    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
    

    And then we can merge again as an inner join on the time-grid 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 讨论(0)
提交回复
热议问题