R 设置日期时间对象之间的差异单位

R 设置日期时间对象之间的差异单位,r,time-series,R,Time Series,diff命令以R date格式返回日期向量中日期之间的差异。我想控制返回的单位,但它们似乎是自动确定的,无法通过参数进行控制。下面是一个例子: > t = Sys.time() > diff(c(t, t + 1)) Time difference of 1 secs 然而: > diff(c(t, t+10000)) Time difference of 1.157407 days “time delta”对象有一个units属性,但编写一组条件将所有内容强制转换

diff
命令以R date格式返回日期向量中日期之间的差异。我想控制返回的单位,但它们似乎是自动确定的,无法通过参数进行控制。下面是一个例子:

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

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

“time delta”对象有一个units属性,但编写一组条件将所有内容强制转换为天、秒等似乎很愚蠢。

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> 

我不确定你所说的“一堆条件”是什么意思,只是手动更改单位

> 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
>t=Sys.time()
>a b单位(a)单位(b)a
时差为0.01666667分钟
>b
时差166.6667分钟

请参见
?difftime
。如果您只需要使用
diff
来获得两次之间的差值(而不是更长的向量),那么,正如德克所建议的,使用
difftime
函数和
units
参数。

我认为您需要
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

不确定您希望精确到什么程度,但您可以通过lubridate软件包获得非常具体的日期时间。时间单位的一个不可靠之处是,它们的长度取决于它们发生的时间,因为闰秒、闰日和其他约定

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

library(lubridate)
int <- Sys.time() - (Sys.time() + 10000) 
或者你可以把int改成句点。与持续时间不同,周期的长度并不精确且一致。但他们忠实地绘制了时钟时间。你可以通过加减句点和持续时间来计算日期时间

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

如果您需要使用diff()函数(例如,正如我在ddply函数中所做的那样),您还可以将输入数据转换为数字格式,以便始终以秒为单位接收差异,如下所示:

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

从那时起,您可以使用差异秒来计算其他单位的差异。

那么,您的问题是什么?你真正想做什么?获取两个日期对象之间的秒差?抱歉,但我不清楚。我希望它返回组成单位,而不考虑输入,也就是说,无论两个日期之间的增量是多少,diff总是以相同的单位返回增量,无论是天、秒、年。谢谢-我没有意识到我可以这样更改单位-我想我必须做一些类似if(diff(t)$units==“sec”)的事情 ...
> t = Sys.time() 
> diff(as.numeric(c(t, t+1)))
[1] 1
> diff(as.numeric(c(t, t+10000)))
[1] 10000