rtt往返时间
在我的上一篇文章中,我展示了一些使用R的lubridate程序包的示例, 该程序真正易于解决的另一个问题是确定特定日期时间与周末的距离。
我想编写一个函数,该函数将根据更接近的位置返回上一个星期日或下一个星期六。
lubridate的floor_date和ceiling_date函数使此操作非常简单。
例如,如果我们想将12月18日向下舍入到本周初,直到下一周开始,我们可以执行以下操作:
> library(lubridate)
> floor_date(ymd("2014-12-18"), "week")
[1] "2014-12-14 UTC"
> ceiling_date(ymd("2014-12-18"), "week")
[1] "2014-12-21 UTC"
对于将来的日期,我们实际上想获取星期六而不是星期日,因此我们将从中减去一天:
> ceiling_date(ymd("2014-12-18"), "week") - days(1)
[1] "2014-12-20 UTC"
现在,我们将其放到一个函数中,该函数查找给定日期的最近周末:
findClosestWeekendDay = function(dateToLookup) {
before = floor_date(dateToLookup, "week") + hours(23) + minutes(59) + seconds(59)
after = ceiling_date(dateToLookup, "week") - days(1)
if((dateToLookup - before) < (after - dateToLookup)) {
before
} else {
after
}
}
> findClosestWeekendDay(ymd_hms("2014-12-13 13:33:29"))
[1] "2014-12-13 UTC"
> findClosestWeekendDay(ymd_hms("2014-12-14 18:33:29"))
[1] "2014-12-14 23:59:59 UTC"
> findClosestWeekendDay(ymd_hms("2014-12-15 18:33:29"))
[1] "2014-12-14 23:59:59 UTC"
> findClosestWeekendDay(ymd_hms("2014-12-17 11:33:29"))
[1] "2014-12-14 23:59:59 UTC"
> findClosestWeekendDay(ymd_hms("2014-12-17 13:33:29"))
[1] "2014-12-20 UTC"
> findClosestWeekendDay(ymd_hms("2014-12-19 13:33:29"))
[1] "2014-12-20 UTC"
我将星期日日期设置为23:59:59,以便可以在下一步中使用该日期,在此我们要计算从当前日期到最近的周末多少小时。
我最终得到了这个功能:
distanceFromWeekend = function(dateToLookup) {
before = floor_date(dateToLookup, "week") + hours(23) + minutes(59) + seconds(59)
after = ceiling_date(dateToLookup, "week") - days(1)
timeToBefore = dateToLookup - before
timeToAfter = after - dateToLookup
if(timeToBefore < 0 || timeToAfter < 0) {
0
} else {
if(timeToBefore < timeToAfter) {
timeToBefore / dhours(1)
} else {
timeToAfter / dhours(1)
}
}
}
> distanceFromWeekend(ymd_hms("2014-12-13 13:33:29"))
[1] 0
> distanceFromWeekend(ymd_hms("2014-12-14 18:33:29"))
[1] 0
> distanceFromWeekend(ymd_hms("2014-12-15 18:33:29"))
[1] 18.55833
> distanceFromWeekend(ymd_hms("2014-12-17 11:33:29"))
[1] 59.55833
> distanceFromWeekend(ymd_hms("2014-12-17 13:33:29"))
[1] 58.44194
> distanceFromWeekend(ymd_hms("2014-12-19 13:33:29"))
[1] 10.44194
尽管此方法有效,但在包含很多行的数据框架上运行它时,速度却很慢。
必须有一个聪明的R方法来做同样的事情(也许使用矩阵),而我还没有想到,所以如果您知道如何加快速度,请告诉我。
翻译自: https://www.javacodegeeks.com/2014/12/r-time-tofrom-the-weekend.html
rtt往返时间