【问题标题】:Set units of difference between datetime objects设置日期时间对象之间的差异单位
【发布时间】:2011-03-22 19:00:17
【问题描述】:

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

“时间增量”对象有一个单位属性,但是编写一堆条件来将所有内容强制转换为天、秒等似乎很愚蠢。

【问题讨论】:

  • 那么,您的问题是什么?你真正想做的是什么?获取两个日期对象之间的秒数差异?抱歉,我不清楚。
  • 无论输入如何,我都希望它返回组成单位,即,无论两个日期之间的增量是什么,diff 总是以相同的单位返回增量,无论是天、秒还是年.

标签: r time-series


【解决方案1】:

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

> 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 建议的那样,使用带有 units 参数的 difftime 函数。

【讨论】:

  • 谢谢 - 我没有意识到我可以那样改变单位——我想我必须做一些类似 if(diff(t)$units=="sec") .. .
【解决方案2】:

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> 

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      不确定您需要多精确,但您可以使用 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
      

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-02-04
          • 2013-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 1970-01-01
          • 1970-01-01
          • 2012-09-13
          相关资源
          最近更新 更多