Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 润滑间隔长度_R_Lubridate - Fatal编程技术网

R 润滑间隔长度

R 润滑间隔长度,r,lubridate,R,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 (我还将此作为一个功能请求添加到,假设没有更好

获取
润滑油
间隔
表示的时间长度(以指定单位表示)的最佳方法是什么?我所能想到的是类似于以下混乱的事情:

> 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
(我还将此作为一个功能请求添加到,假设没有更好的方法可用——但这里可能有人知道一个。)

Update-显然
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
>(d1(d2(i2 difftime)(attr(i2,“开始”)+as.numeric(i2),attr(i2,“开始”),“天”)
时差23小时

正如我在下面提到的,我认为处理这个问题的一个好方法是实现一个
/.interval
函数,该函数不首先将其输入转换为
时段
As.duration
函数是lubridate提供的。interval类在内部表示为从开始到结束的秒数,因此如果您想要d您可以简单地将
as.numeric(ival)
除以3600,或除以(3600*24)天数的小时数

如果您希望将函数的工作示例应用于对象,则应提供
dput(ival
)的输出。我对
帮助(持续时间)
页面上创建的对象进行了测试,该页面是
?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
dateKen,除以天(1)将得到您想要的。当您将间隔除以周期时,Lubridate不会强制周期为持续时间。(虽然计算时间间隔中整段时间的精确数量的算法是从使用时间间隔除以持续时间的估计开始的,这可能就是您所注意到的)

最终结果是适合间隔的完整周期数。警告消息提醒用户这是一个估计值,因为将有一部分周期从答案中删除。用一部分周期进行数学计算是不明智的,因为我们不能用它修改时钟时间,除非我们将它转换为倍数f较短的时间段-但没有一致的转换方式。例如,您提到的日期等于23小时,但其他日期等于24小时。您认为正确的方式-时间段试图尊重DST、闰年等造成的变化,但它们仅作为整体单位来做

我无法重现你上面提到的减法错误。它似乎对我有用

    three <- force_tz(ymd_hms("2011-03-12 12:00:00"), "") 
    # note: here in TX, "" *is* CST
    (four <- three + days(1))
    > [1] "2011-03-13 12:00:00 CDT"
    four - days(1)
    > [1] "2011-03-12 12:00:00 CST"
3[1]“2011-03-12 12:00:00 CST”

这个问题真的很老了,但我正在添加一个更新,因为这个问题已经被浏览了很多次,当我今天需要做类似的事情时,我找到了这个页面。在
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)
> date_f <- now()
> date_i <- now() - days(23)
> as.duration(date_f - date_i)/ddays(1)
[1] 22.95833
> interval(date_i,date_f)/ddays(1)
[1] 22.95833
> int_length(interval(date_i,date_f))/as.numeric(ddays(1))
[1] 22.95833
> e <- ymd_hms("2021-03-13 00:00:10", tz = 'UTC')
> s <- ymd_hms("2021-03-12 23:59:50", tz = 'UTC')
> as.duration(e - s)
[1] "20s"
> as.duration(e - s)/ddays(1)
[1] 0.0002314815
> as.numeric(as.Date(e) - as.Date(s))
[1] 1

d1在以秒为单位预测时间以获得天数时要小心,因为此时您不再使用抽象的时间表示,而是使用简单的数字,这可能导致以下情况:

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)
> date_f <- now()
> date_i <- now() - days(23)
> as.duration(date_f - date_i)/ddays(1)
[1] 22.95833
> interval(date_i,date_f)/ddays(1)
[1] 22.95833
> int_length(interval(date_i,date_f))/as.numeric(ddays(1))
[1] 22.95833
> e <- ymd_hms("2021-03-13 00:00:10", tz = 'UTC')
> s <- ymd_hms("2021-03-12 23:59:50", tz = 'UTC')
> as.duration(e - s)
[1] "20s"
> as.duration(e - s)/ddays(1)
[1] 0.0002314815
> as.numeric(as.Date(e) - as.Date(s))
[1] 1

因此,这取决于你在寻找什么:时差或日历差。

谢谢,但这不正确-3600*24并不总是一天中的秒数。我试图做的是进入已经处理DST等事情的系统。@KenWilliams我不明白你为什么认为这是错误的。
?持续时间
似乎暗示它实际上尊重DST,就像
difftime
一样。当我使用
as.duration
转换您的示例时,我得到的答案与使用
difftime
得到的答案完全相同。您也可以将持续时间除以天数(1)很好,即使difftime()没有进行我当时正在寻找的计算=(我正在寻找一种计算方法,在
2011-03-12 12:00:00
2011-03-13 12:00:00
时区中,
America/Chicago
之间的天数差为1天,即使那一天只有23小时。我将更新我的问题。@hadley-我要寻找的可能是将时间间隔除以
days(1)
,但目前处于
润滑状态,首先将其转换为
持续时间,然后(非常正确)给出一个警告。你说你想要一个特定单位的间隔,但从下面评论的上下文来看,听起来好像你想把它四舍五入到最接近的整个单位。如果是这样,你能进一步编辑以使其清晰吗?不,我不想让它四舍五入。也许我刚才所做的编辑有助于澄清?然而,对于间隔,有一种方法可以使其相反离子,因为它植根于一个精确的瞬间。你不知道某一天是否有24小时,但你知道这一天是否有24小时,所以计算应该是可能的。@KenWilliams我同意你的观点。Lubridate目前不做这个计算,但也许应该。我的想法是,剩余的可能是间隔的第一天,但是间隔的最后一天的12/23。也许最后一天才是最重要的。