2012-10-19 218 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()'只是清除类和'“单元”'属性。 –