我如何在R中巧妙地找到以前的时间段开始和结束?

时间:2019-04-17 09:31:59

标签: r xts lubridate

我想在R中找到以前的开始和结束时间。期限以分钟为单位。

会喜欢下面的输出。

library(lubridate)
timeNow <- now()
timeNow
# [1] "2019-04-17 11:17:09 CEST"

periodLength <- 60    #minutes
previousPeriodStart(timeNow, periodLength)
# [1] "2019-04-17 10:00:00 CEST"
previousPeriodEnd(timeNow, periodLength)
# [1] "2019-04-17 10:59:59 CEST"

periodLength <- 5    #minutes
previousPeriodStart(timeNow, periodLength)
# [1] "2019-04-17 11:10:00 CEST"
previousPeriodEnd(timeNow, periodLength)
# [1] "2019-04-17 11:14:59 CEST"

如果我有ts的数据,我了解如何在xts中构建这些功能。 由于我没有此示例的数据集,因此无法使用xts.period函数。相反,我只想找到起点和终点。

构造previousPeriodStart和previousPeriodEnd的最聪明的方法是什么?还是我应该开始使用纪元/ unix时间做一些算术运算?

预先感谢。

---编辑---- 由于收到的答案的功能可以回答同一功能的开始和结束,因此这当然要聪明得多。

3 个答案:

答案 0 :(得分:3)

像这样吗?

library(lubridate)
timeNow <- now()

period = 60

floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)
floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)+minutes(period)-seconds(1)

period = 5

floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)
floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)+minutes(period)-seconds(1)

答案 1 :(得分:3)

使用lubridate可以很容易地做到这一点:

previousPeriod <- function(timeNow,periodLength)
{
  start <- floor_date(timeNow - minutes(60),"hour")
  end <- ceiling_date(timeNow - minutes(60),"hour") - seconds(1)
  return(c(start=start,end=end))
}

previousPeriod(timeNow,periodLength)

                    start                       end 
"2019-04-17 10:00:00 UTC" "2019-04-17 10:59:59 UTC" 

答案 2 :(得分:1)

在使用floor_date的其他两个答案的基础上,我改进了最快的答案,还包括除了整小时以外的其他分钟间隔的工作代码。

previousPeriods <- function(timeNow, periodLength)
{
  periodPhrase <- paste0(periodLength, " mins")  # To create periods such as "5 mins"
  start <- floor_date(timeNow - minutes(periodLength), periodPhrase)
  end <- ceiling_date(timeNow - minutes(periodLength), periodPhrase) - seconds(1)
  return(c(start=start,end=end))
}

再次感谢您提供快速解答的所有帮助。