2013-02-25 12 views
0

我有以下功能。 CreateChronVector確實如此。默認情況下,結果矢量每小時一次。函數將小時向量四捨五入到小時。如何創建時間記錄均勻分佈的時鐘序列(一致的delta t)

CreateChronVector <- function(chronFrom, chronTo, frequency = "hourly") { 
    library(chron) 
    datesFrom <- dates(chronFrom) 
    timesFrom <- (chronFrom - dates(chronFrom)) 
    datesTo <- dates(chronTo) 
    timesTo <- (chronTo - dates(chronTo)) 
    if ((timesFrom != 0 || timesTo != 0) && frequency == "daily") { 
     print("Error: The indicated dates have hour components while the given frequency is daily.") 
    } 
    else { 
     if (timesTo == 0 && frequency == "hourly") { 
      timesTo <- 23/24 
     } 
     if (frequency == "hourly") { 
      chronFrom <- chron(dates = datesFrom, times = timesFrom, 
       format = c(dates = "m/d/y", times = "h:m:s")) 
      chronTo <- chron(dates = datesTo, times = timesTo, 
       format = c(dates = "m/d/y", times = "h:m:s")) 
      dateVector <- seq(chronFrom, chronTo, by = 1/24) 
     } 
     else if (frequency == "daily") { 
      dateVector <- seq(datesFrom, datesTo) 
     } 
     return(dateVector) 
    } 
} 

RoundHour <- function(x) { 
    res <- trunc(x,'hours', eps=1e-17) 
    res <- ifelse((x-res) > 0.5/24, res+1/24, res) 
    return(as.chron(res)) 
} 

我面臨的問題是間隔不一致。作爲一個例子,下面的代碼返回兩個不同的間隔尺寸:

unique(diff(CreateChronVector(as.chron('2010-01-01'), as.chron('2010-01-01')))) 

同樣的,用我的舍入函數不能解決問題:

unique(diff(RoundHour(CreateChronVector(as.chron('2010-01-01'), as.chron('2010-01-01'))))) 

我敢肯定,這個問題有圓做關閉錯誤。我一直在嘗試使用trunc函數和它的eps參數,但沒有運氣。

+0

'chron'使用浮點,所以你不能真正期望間隔是完全相同的。間隔長度之間的差異可以忽略不計,應該足夠好。 – 2013-02-25 23:32:12

+0

你需要使用chron嗎?在xts中,您可以非常輕鬆地完成所有操作。 – 2013-02-26 03:56:01

+0

感謝xts @geektrader的建議。我只是印了小插曲。看起來很有希望! – JAponte 2013-02-27 16:59:20

回答

0

the point from @G. Grothendieck,你可以看到他在說什麼,如果你試試這個:

hours <- 1:23 
dateVector <- sapply(hours , function(x){ chron(dates = "01/01/10" , times = paste0(x,":00:00")) }) 
head(dateVector) 
[1] 14610.04166666666606034 14610.08333333333393966 14610.12500000000000000 
[4] 14610.16666666666606034 14610.20833333333393966 14610.25000000000000000 
unique(diff(dateVector)) 
[1] 0.04166666666787932626903 0.04166666666606033686548 

所以你不能真正做到這一點,因爲這些數字不能精確浮點來表示,但這有什麼重要的原因嗎?

+0

我使用日期/時間值從不同來源接收原始數據。我想把它們整理到一小時,以便能夠將它們合併到相同的數據框架中並執行一些時間序列分析。當我將數值四捨五入時,我們最終可能會遺失記錄,這會導致不規則的時間序列。這就是爲什麼我首先使用CreateChronVector來獲取具有所有必需日期/時間值的data.frame,然後將其與最終結果合併。但由於時間值存在細微的差異,合併往往會重複時間記錄。 – JAponte 2013-02-26 14:55:35

+0

@JAponte你的時間數據是什麼格式?是否如上?一種數字類型,用於指定自原始日期以來經過的天數和天數? – 2013-02-26 18:40:41

+0

它是時辰格式。你的榜樣適合我的情況。我嘗試將數字位數舍入到7,但我仍然有同樣的問題。 'unique(diff(round(dateVector,7)))' – JAponte 2013-02-27 21:28:56

0

您可以使用xts包。一旦在xts對象中有數據,則可以使用align.time函數來「收集」時間索引。幾乎所有的時間序列分析都非常方便xts

PS:如果您提供可重複的數據示例,我將以示例更新答案。

+0

這裏是我的一種數據的例子。我需要在一個數據結構中混合分類和數字變量,因爲我需要跟蹤系統的異常值和狀態:'x <-xts(data.frame(A = 1:24,B = letters [1:24] ),chron(rep(0,24),(0:23)/ 24))' – JAponte 2013-03-01 14:24:16

+0

@Japonte爲什麼不將分類變量轉換爲數值等同於做時間序列的切片和切塊,然後將結果轉換回數據幀。 – 2013-03-01 18:53:06

相關問題