R的回合时间为X小时?

时间:2017-02-27 21:36:03

标签: r date data.table posixct

在预测时间戳数据的建模时,我想在R中编写一个函数(可能使用data.table),将日期舍入X个小时。例如。四舍五入应该给出:

"2014-12-28 22:59:00 EDT" becomes "2014-12-28 22:00:00 EDT" 
"2014-12-28 23:01:00 EDT" becomes "2014-12-29 00:00:00 EDT" 

使用round.POSIXt(.date, "hour")功能时,使用if功能可以轻松完成 编写一个通用函数,就像我在下面使用多个d7.dateRoundByHour <- function (.date, byHours) { if (byHours == 1) return (round.POSIXt(.date, "hour")) hh = hour(.date); dd = mday(.date); mm = month(.date); yy = year(.date) hh = round(hh/byHours,digits=0) * byHours if (hh>=24) { hh=0; dd=dd+1 } if ((mm==2 & dd==28) | (mm %in% c(1,3,5,7,8,10,12) & dd==31) | (mm %in% c(2,4,6,9,11) & dd==30)) { # NB: it won't work on 29 Feb leap year. dd=1; mm=mm+1 } if (mm==13) { mm=1; yy=yy+1 } str = sprintf("%i-%02.0f-%02.0f %02.0f:%02.0f:%02.0f EDT", yy,mm,dd, hh,0,0) as.POSIXct(str, format="%Y-%m-%d %H:%M:%S") } 语句一样,但是变得相当丑陋:

detail = Parking.joins(:cars).select('parkings.*, count(cars.parking_id) as Alloted, no_of_places - count(parking_id) as Remaining, cars.*, cars.id as car_id').group('place_name')

任何人都可以展示更好的方法吗?
(也许通过转换为数字并返回POSIXt或其他一些POSIXt函数?)

2 个答案:

答案 0 :(得分:4)

这实际上很简单,只有基础R.圆形的基本想法是&#34;奇数&#34;你

  • 缩小适当的比例因子
  • 向下舍入到缩小单位的整数
  • 缩放并重新转换

或者在两个R代码语句中:

R> pt <- as.POSIXct(c("2014-12-28 22:59:00", "2014-12-28 23:01:00 EDT"))
R> pt   # just to check
[1] "2014-12-28 22:59:00 CST" "2014-12-28 23:01:00 CST"
R> 
R> scalefactor <- 60*60*2   # 2 hours of 60 minutes times 60 seconds
R> 
R> as.POSIXct(round(as.numeric(pt)/scalefactor) * scalefactor, origin="1970-01-01")
[1] "2014-12-28 22:00:00 CST" "2014-12-29 00:00:00 CST"
R> 

关键的最后一行只是做了我概述的内容:将POSIXct转换为数字表示,将其缩小,然后在缩小比例并再次转换为POSIXct之前进行舍入。

答案 1 :(得分:3)

使用lubridate包中的round_date函数。假设您有一个名为date的列的data.table,您可以执行以下操作:

dt[, date := round_date(date, '2 hours')]

一个简单的例子将为您提供您正在寻找的结果:

x <- as.POSIXct("2014-12-28 22:59:00 EDT")
round_date(x, '2 hours')