以指定单位表示以interval
in 表示的时间长度的最佳方法是什么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)