2012-10-19 216 views
2

由於被問到「明顯」問題而被拒絕的極端風險,我如何找到R中兩個小時之間的差異?如何查找R中兩個日期之間的差異?

> ISOdate(2004,1,6) - ISOdate(2004,1,1) 
Time difference of 5 days 
> as.POSIXlt(ISOdate(2004,1,6) - ISOdate(2004,1,1)) 
Error in as.POSIXlt.default(ISOdate(2004, 1, 6) - ISOdate(2004, 1, 1)) : 
    do not know how to convert 'ISOdate(2004, 1, 6) - ISOdate(2004, 1, 1)' to class "POSIXlt" 
> (ISOdate(2004,1,6) - ISOdate(2004,1,1))$year 
Error in (ISOdate(2004, 1, 6) - ISOdate(2004, 1, 1))$year : 
    $ operator is invalid for atomic vectors 
> (ISOdate(2004,1,6) - ISOdate(2004,1,1))$mon 
Error in (ISOdate(2004, 1, 6) - ISOdate(2004, 1, 1))$mon : 
    $ operator is invalid for atomic vectors 
+2

感謝驅動的反對票。解釋如何做到這一點的文件可能會有用。我見過的所有內容都指向strptime,它涉及字符串,字符串對日期的區域設置非常敏感。 –

+3

'?ISOdate'告訴你是讀了'?DateTimeClasses',它告訴你,「兩個日期時間目標的減法等同於使用'difftime'。」在提出「明顯」問題之前,請閱讀文檔。 –

回答

13

使用功能difftime,用參數units="hours"

x <- c(ISOdate(2004,1,6), ISOdate(2004,1,1)) 
difftime(x[1], x[2], units="hours") 
Time difference of 120 hours 

我怎麼知道去哪裏找?所以,現在你知道你正在處理一類的difftime

str(x[1] - x[2]) 
Class 'difftime' atomic [1:1] 5 
    ..- attr(*, "units")= chr "days" 

好,通過看你的對象的結構,當你減去兩個時間開始。從這裏可以很容易地找到幫助:請參見?difftime

+0

耶!謝謝!請注意,它似乎需要添加「as.numeric」才能獲得實際的數字。 –

+0

(請注意,我不能標誌着你的答案被接受,只是還沒有,但我會一旦它讓我)我再次 –

+3

@HughPerkins覺得你是不是注意到一個對象的實際存儲。做'tmp < - difftime(x [1],x [2],units =「hours」)'然後'unclass(tmp)'注意它是一個長度爲1的數字向量。這是打印方法和使用屬性''單位''給它一個字符的味道。你不需要將它轉換爲數字來使用它,因爲它已經是數字;例如,「tmp + 1」。你提到的'as.numeric()'只是清除類和'「單元」'屬性。 –