2012-05-03 22 views
7

से नियमित रूप से 15 मिनट की समय श्रृंखला बनाना मैं एक अनियमित समय श्रृंखला (DATETIME और RainfallValue के साथ) एक csv फ़ाइल C:\SampleData.csv में है:अनियमित समय श्रृंखला


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 

नोट: अनियमित समय कदम 1 मिनट, 15 मिनट, 1 घंटा इत्यादि हो सकते हैं। इसके अलावा, वांछित 15-मिनट अंतराल में कई अवलोकन हो सकते हैं।

मैं 2001/12/31 के लिए 2000/01/01 से एक नियमित रूप से 15 मिनट की समय श्रृंखला बनाने के लिए दिखना चाहिए उस तरह कोशिश कर रहा हूँ:


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 

नोट: समय श्रृंखला है 15 मिनट के अंतराल के साथ नियमित रूप से, 0 के साथ लापता डेटा भरना। यदि 15 मिनट अंतराल में एक से अधिक डेटा पॉइंट हैं, तो उन्हें सारांशित किया जाता है।

यहाँ मेरी कोड है:


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) 

समस्या: उत्पादन समय श्रृंखला TS_align15min: समय टिकटों की (क) दोहरा है ब्लॉक (ख) 1999 से (रहस्यमय तरीके से) शुरू होता है, के रूप में:

 
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

हमारे लिए कुछ प्रतिलिपि प्रस्तुत करने योग्य कोड जेनरेट करें, dput () उपयोगी है। लाइब्रेरी या आवश्यकता के साथ योगदान पैकेजों का उपयोग भी घोषित करें। – mdsumner

+0

@mdsumner सुझाव के लिए धन्यवाद। मैंने पुनरुत्पादित नमूना डेटा और कोड जोड़ा है। – akashwani

+0

नहीं, अगर यह किसी डेटा फ़ाइल पर निर्भर करता है तो हमारे पास पुन: उत्पन्न नहीं होता है। दिए गए बीज के साथ _random data_ के लिए मेरा उत्तर देखें - जो इसे पुन: उत्पन्न करता है। –

उत्तर

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() टिप्पणियों ले जाने के लिए आगे:

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 

और फिर हम एक के रूप में फिर से विलय कर सकते हैं समय-ग्रिड पर भीतरी में शामिल होने twoh XTS:

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

धन्यवाद! अच्छा लग रहा है। मुझे अपना कोड बदलने के लिए इसे वापस करने दें और वापस आएं। मैंने पुनरुत्पादन कोड और नमूना डेटा को शामिल करने के लिए अपनी मूल पोस्ट भी बदल दी है। – akashwani

+5

लालित्य के संबंध में: आपको 'दोh' ऑब्जेक्ट की आवश्यकता नहीं है। आप 'खाली' xts ऑब्जेक्ट ('xts (, twohours) 'के साथ' अवलोकन 'को मर्ज कर सकते हैं, उस पर' na.locf' का उपयोग करें, फिर 'दोhours' के साथ सबसेट करें। या, एक पंक्ति में: 'na.locf (विलय (xts (, दोhours), अवलोकन)) [दो घंटे]'। –

+0

मैंने इस तरह से सबसेटिंग भी की है ('इंडेक्स (दो एच)' का उपयोग करके, लेकिन मुझे स्टंप किए गए त्रुटियों के साथ समाप्त हुआ। यह देखने के लिए अच्छा है कि मैं सही ट्रैक पर था ... –

3

यहाँ एक data.table समाधान, इस बड़े करीने से एक रोलिंग उपयोग किया जा सकता है में शामिल होने:

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] 
संबंधित मुद्दे