2011-03-22 52 views
10

diff命令以R日期格式返回日期向量中日期之间的差异。我想控制返回的单位,但似乎它们是自动确定的,无法用参数控制它。这里有一个例子:设置日期时间对象之间的差异单位

> t = Sys.time() 
> diff(c(t, t + 1)) 
Time difference of 1 secs 

然而:

> diff(c(t, t+10000)) 
Time difference of 1.157407 days 

的“时间差”对象有一个单位的属性,但它似乎愚蠢写一堆条件句强迫一切都变成天,秒等

+1

那么,你的问题是什么?你真的想做什么?获取两个日期对象之间的秒差?对不起,但我不清楚。 – Andrie 2011-03-22 19:06:23

+0

无论输入是什么,我都希望它返回包含单位,即无论两个日期之间的差值是多少,差异总是以相同的单位返回差值,无论是天,秒,年。 – 2011-03-22 19:08:59

回答

12

我不知道你的意思是“一堆条件句,”只是手动更改单位。

> t = Sys.time() 
> a <- diff(c(t,t+1)) 
> b <- diff(c(t, t+10000)) 
> units(a) <- "mins" 
> units(b) <- "mins" 
> a 
Time difference of 0.01666667 mins 
> b 
Time difference of 166.6667 mins 

参见?difftime。如果您只需要使用diff来获得两次之间的差异(而不是较长的向量),那么,如Dirk所示,使用difftime函数和units参数。

+1

谢谢 - 我没有意识到,我可以改变单位的方式---我认为我将不得不做类似if(diff(t)$ units ==“sec”)... – 2011-03-22 19:21:57

9

A POSIXct类型(您通过调用Sys.time()创建的)始终使用自纪元以来的小数秒。

difftime()功能只是格式这不同于您的阅读乐趣。如果你确实指定格式,你得到你所指定的内容:

R> difftime(t+ 10000,t,unit="secs") 
Time difference of 10000 secs 
R> difftime(t+ 10000,t,unit="days") 
Time difference of 0.115741 days 
R> 
6

我认为你需要difftime其中你可以指定所需的单位。请参阅:

> difftime(Sys.time(), Sys.time()+10000) 
Time difference of -2.777778 hours 

> difftime(Sys.time(), Sys.time()+10000, units="secs") 
Time difference of -10000 secs 
1

不知道你怎么在意精确的是,但你可以得到非常具体日期时间与lubridate包。关于时间单位的一个诡异的事情是,它们的长度取决于它们何时发生,因为闰秒,闰日和其他约定。

加载lubridate后,减去日期时间会自动创建时间间隔对象。

library(lubridate) 
int <- Sys.time() - (Sys.time() + 10000) 

然后,您可以将其更改为测量确切时间长度的持续时间。持续时间以秒为单位显示,因为秒是唯一具有一致长度的单位。如果你想在特定的单位中得到你的答案,只需除以一个长度为其中一个单位的持续时间对象。

as.duration(int) 
int/dseconds(1) 
int/ddays(1) 
int/dminutes(5) #to use "5 minutes" as a unit 

或者你可以改变一个句点int。与持续时间不同,周期不具有准确一致的长度。但他们忠实地映射时钟时间。你可以通过加入和减去日期和时间来计算数学。

as.period(int) 
Sys.time() + dseconds(5) + dhours(2) - ddays(1) 
Sys.time() + hours(2) + months(5) - weeks(1) #these are periods 
1

如果冯需要使用diff()函数(例如,作为我一个ddply函数中做),你也可以把输入数据转换成数字格式在几秒钟内总是收到不同是这样的:

> t = Sys.time() 
> diff(as.numeric(c(t, t+1))) 
[1] 1 
> diff(as.numeric(c(t, t+10000))) 
[1] 10000 

从这一点开始,您可以使用diff秒计算其他单位的差异。