润滑间隔的长度

Ken*_*ams 7 r lubridate

以指定单位表示以intervalin 表示的时间长度的最佳方法是什么lubridate?我能弄明白的就是下面这个混乱的东西:

> ival
[1] 2011-01-01 03:00:46 -- 2011-10-21 18:33:44

> difftime(attr(ival, "start") + as.numeric(ival), attr(ival, "start"), 'days')
Time difference of 293.6479 days
Run Code Online (Sandbox Code Playgroud)

(我还在https://github.com/hadley/lubridate/issues/105上添加了这个功能请求,假设没有更好的方法可用 - 但也许有人知道一个.)

更新 - 显然该difftime功能也无法处理.这是一个例子.

> (d1 <- as.POSIXct("2011-03-12 12:00:00", 'America/Chicago'))
[1] "2011-03-12 12:00:00 CST"
> (d2 <- d1 + days(1))  # Gives desired result
[1] "2011-03-13 12:00:00 CDT"
> (i2 <- d2 - d1)
[1] 2011-03-12 12:00:00 -- 2011-03-13 12:00:00 
> difftime(attr(i2, "start") + as.numeric(i2), attr(i2, "start"), 'days')
Time difference of 23 hours
Run Code Online (Sandbox Code Playgroud)

正如我在下面提到的,我认为处理这个的一个好方法是实现一个/.interval不首先将其输入转换为a的函数period.

Mic*_*war 11

这个问题确实很旧,但我添加了一个更新,因为这个问题已经被查看了很多次,当我今天需要做这样的事情时,我找到了这个页面。您现在lubridate可以执行以下操作:

d1 <- ymd_hms("2011-03-12 12:00:00", tz = 'America/Chicago')
d2 <- ymd_hms("2011-03-13 12:00:00", tz = 'America/Chicago')

(d1 %--% d2)/dminutes(1)
(d1 %--% d2)/dhours(1)
(d1 %--% d2)/ddays(1)
(d1 %--% d2)/dweeks(1)
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 10

as.duration功能是lubridate提供的功能.间隔类在内部表示为从开始起的秒数,因此如果您想要小时数,则可以简单地除以as.numeric(ival)3600或(3600*24)天.

如果你想要应用于你的对象的函数的工作示例,你应该提供输出dput(ival).我对发送给我的help(duration)页面上创建的对象进行了测试?interval.

 date <- as.POSIXct("2009-03-08 01:59:59") # DST boundary
 date2 <- as.POSIXct("2000-02-29 12:00:00")
 span <- date2 - date  #creates interval 
 span
#[1] 2000-02-29 12:00:00 -- 2009-03-08 01:59:59 
 str(span)
#Classes 'interval', 'numeric'  atomic [1:1] 2.85e+08
#  ..- attr(*, "start")= POSIXct[1:1], format: "2000-02-29 12:00:00"
 as.duration(span)
#[1] 284651999s (9.02y) 
 as.numeric(span)/(3600*24)
#[1] 3294.583
# A check against the messy method:
difftime(attr(span, "start") + as.numeric(span), attr(span, "start"), 'days')
# Time difference of 3294.583 days
Run Code Online (Sandbox Code Playgroud)