在對時間戳數據進行預測建模時,我想在R中編寫一個函數(可能使用data.table),將日期舍入X小時。例如。 2小時四捨五入應該給這個:在R中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"
這是很容易做到的輪1小時,當你 - 使用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")
}
任何人都可以表現出更好的方式來做到這一點?
(也許通過轉換爲數字和回POSIXt或一些其它功能POSIXt?)
包'highfrequency'有一個名爲'aggregatets()'的包裝,它應該給你想要的結果 – Rime