2017-06-21 57 views
0

当我们采取两次的差异,有自动发生在那里的单位。Lubridate修复时间单位

> ymd_hms("2016-05-09 15:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of -1 secs 
> ymd_hms("2016-05-09 16:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of 59.98333 mins 
> ymd_hms("2016-05-10 16:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of 1.041655 days 

如何修复单位而不使用difftime函数。

因此,我可以做到以下几点:

VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
      ymd_hms("2016-05-10 17:19:33"), 
      ymd_hms("2016-05-10 19:55:03") 
     ) 

diffs = diff(VECTOR) 

IntervalsInHours = toHours(diffs) 

此外,有没有办法知道在lubridate时间对象所使用的单位。例如,

> ymd_hms("2016-05-09 15:17:03") - ymd_hms("2016-05-09 15:17:04") 
Time difference of -1 secs 

这里使用的单位是seconds

+0

乘以24得到小时数 –

+0

您的预期输出是多少?你想在几小时内输出所有上述例子吗? –

+0

我想使用'diff'函数来获取时间点的VECTOR的时间差,只能以指定的单位。 – John

回答

1

“你想使用diff功能采取了矢量元素之间的时间差,只能在指定的单位”

请尝试下面的代码:(通过int_diff函数)

> VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
+   ymd_hms("2016-05-10 16:17:04"), 
+   ymd_hms("2016-05-10 17:19:33"), 
+   ymd_hms("2016-05-10 19:55:03") 
+) 
> as.numeric(int_diff(VECTOR)) 
[1] 1 3749 9330 
> round(as.numeric(int_diff(VECTOR))/3600,2) 
[1] 0.00 1.04 2.59 

看到,无论时间间隔最小单位是秒还是不它总是按照以下秒数缩放。

> VECTOR = c(ymd_hms("2016-05-10 16:17:03"), 
+   #ymd_hms("2016-05-10 16:17:04"), 
+   ymd_hms("2016-05-10 17:19:33"), 
+   ymd_hms("2016-05-10 19:55:03") 
+) 
> as.numeric(int_diff(VECTOR)) 
[1] 3750 9330 
> round(as.numeric(int_diff(VECTOR))/3600,2) 
[1] 1.04 2.59 
1

请在下面尝试将时差转换为小时。

library(lubridate) 
x=ymd_hms("2016-05-09 16:17:03") 
y=ymd_hms("2016-05-19 15:17:04") 
diffs=as.duration(x-y) 
IntervalsInHours=as.numeric(abs(diffs))/3600;IntervalsInHours 
1

,或者你可以用这样的方式:

library(lubridate) 
x=ymd_hms("2016-05-09 16:17:03") 
y=ymd_hms("2016-05-19 16:17:04") 
diffs=as.duration(x-y); 
IntervalsInHours=abs(diffs)/dhours(1);IntervalsInHours 
0

我写了两个函数,以防万一有人觉得有用。

timeDiffUnitConvert = function(Diffs, to="day", roundingN = 1){  
    if(to == "day"){ 
    R = round(as.numeric(as.duration(Diffs))/3600/24,roundingN) 
    } else if (to == "hour") { 
    R = round(as.numeric(as.duration(Diffs))/3600, roundingN) 
    } else if (to == "min") { 
    R = round(as.numeric(as.duration(Diffs))/60, roundingN) 
    } else if (to == "sec"){ 
    R = round(as.numeric(as.duration(Diffs)), roundingN) 
    } else { 
    stop("to which unit? it must be `day`, `hour`, `min` or `sec`.") 
    } 
    R 
} 

timeDiffVector = function(TimeVector, to="day", roundingN = 1, attachNaMode = "none"){ 
    R = timeDiffUnitConvert(diff(TimeVector), to = to, roundingN = roundingN) 
    if(attachNaMode == "leading"){ 
    R = c(NA,R) 
    } else if(attachNaMode == "trailing"){ 
    R = c(R,NA) 
    } else{ 
    stop("check your attachNaMode: shall be either `leading` or `trailing`") 
    } 
    R 
}