2011-12-06 122 views
3

我使用R使用動物園和時鐘進行一些時間序列分析。我有一個有大量數據的動物園對象,並且需要能夠使用window函數將數據分爲只有一天的價值,然後是下一天的價值,然後是下一天等。在R中創建日期日期時間的數組R

I已經試過發現在它與一定時期創造每一天的日期數組的最簡單的方法已經提出了以下幾點:

orig = c(month=1, day=1, year=2005) 
dates <- chron(1:1825, origin=orig, out.format=c(dates="d/m/y", times="h:m")) 

它使用儒略日表示法,並具有1825天(365 * 5 - 五年),從我約會的第一天開始。然後我嘗試使用每個數組的元素做一個for循環:

for (date in dates) 
{ 
    s = chron(date, "00:00:00", origin=orig) 
    e = chron(date, "23:59:59", origin=orig) 

    aeronet_day = window(aeronet, start=s, end=e) 
} 

然而,這給了我一個警告,說我使用的是不同來源的aeronet動物園對象和se變量,它不會選擇任何數據。

有沒有更好的方法來做到這一點?或者解決這個問題的方法?基本上我想要的是運行for循環,在循環中我可以使用aeronet_day = window(aeronet, start=s, end=e)代碼生成包含一天數據的動物園對象(例如2005年5月1日的00:00:00至23:59:59。

+1

我不確定你想要做什麼,但也許'xts :: apply.daily'可能會有幫助嗎? –

+0

您使用'chron' *和*'zoo'(具有自己的時間序列格式)的事實可能會讓您的代碼/生活變得比應該更復雜。你可以只用一個或他們? (如果沒有,請看'lubridate')。 –

+1

@RichieCotton:'動物園'沒有任何時間序列格式。對指數級別完全不知道(即它甚至不需要基於時間),它只是需要訂購。 –

回答

4

假設我們有這樣的數據:

# create test data 
library(zoo) 
library(chron) 
z <- zooreg(1:30, start = chron("2000-01-01"), freq = 2) 

1)骨料 將R aggregate函數具有動物園方法。第二個參數是我們彙總的內容。如果它是一個函數,它將應用於動物園對象的索引。例如在這裏,我們計算出平均每個日期:

z.ag <- aggregate(z, as.Date, mean) 

我們可以用更復雜的功能替代mean如果我們希望。

2)拆分。 R split函數有一個動物園方法。如果我們真的想按日期分割z那麼我們可以做到這一點。這裏的z.split.list是一個列表,其中的每個組件都包含一個日期的動物園對象。

z.split.list <- split(z, as.Date(time(z))) 

現在的(a)sapply或(b)超過lapply該列表或(c)使用下面的(具有期望的任何處理替換print(zc))。這裏zc是列表的一個組分,即它是由只是把特定日期形成動物園對象:

for(zc in z.split.list) print(zc) 

注意as.Date(time(z))是與對應於z的元件的日期的載體。

編輯:

各種細微的闡述。

0

我不熟悉的動物園,但我通常只是轉換日期爲數字,然後進行序列,然後再轉換回例如:

> as.Date(Sys.Date():(Sys.Date()+365), origin='1970-01-01') 
    [1] "2011-12-06" "2011-12-07" "2011-12-08" "2011-12-09" "2011-12-10" "2011-12-11" "2011-12-12" "2011-12-13" 
    [9] "2011-12-14" "2011-12-15" "2011-12-16" "2011-12-17" "2011-12-18" "2011-12-19" "2011-12-20" "2011-12-21" 
[17] "2011-12-22" "2011-12-23" "2011-12-24" "2011-12-25" "2011-12-26" "2011-12-27" "2011-12-28" "2011-12-29" 
[25] "2011-12-30" "2011-12-31" "2012-01-01" "2012-01-02" "2012-01-03" "2012-01-04" "2012-01-05" "2012-01-06" 
[33] "2012-01-07" "2012-01-08" "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13" "2012-01-14" 
[41] "2012-01-15" "2012-01-16" "2012-01-17" "2012-01-18" "2012-01-19" "2012-01-20" "2012-01-21" "2012-01-22" 
... 
+0

爲此,'Sys.Date()+ 0:365'(利用'+ .Date'方法)更加簡潔! –

+0

@JoshO'Brien很好! –

0

如果你想要做的事那麼你所擁有的就是好的了。

部分樣本aeronet數據。

last_date <- 1825 
n <- 10000 
aeronet <- data.frame(
    some.value = seq_len(n), 
    date = as.chron(
    runif(n, 0, last_date), 
    origin = orig, 
    out.format = c(dates = "d/m/y", times = "h:m") 
) 
) 

現在,您可以通過使用split日期分割數據,或應用功能,每個日期從plyrtapplyddply(或使用aggregate或其他)。

with(aeronet, split(some.value, date)) 
with(aeronet, tapply(some.value, date, sum)) 

library(plyr) 
ddply(aeronet, .(date), summarise, sum(some.value))