R:四舍五入到最近的小时

R: rounding time to the nearest hour

我有一个时间向量(来自 Excel 文件)。 它作为一个因素被读入。 这是一个简短的version/example:

starttime <- factor(c("12:55:00", "13:45:00", "14:30:00", "10:00:00", "10:40:00", "12:00:00", "12:30:00"))

我想将所有这些时间四舍五入到军事时间中最接近的小时,并将小时提取为整数,然后我 运行 遇到了尝试使用包或基本函数来完成的问题。我使用了 lubridate 包,并尝试了:

round_date(hms(starttime), unit= "hour")

hms 本身似乎工作正常(我确实得到了我的数据作为 class 句点),但是然后将它与 round_date 结合使用会给我错误

Error in as.POSIXct.numeric(x) : 'origin' must be supplied

然后我尝试了以下操作(1904 因为它是来自 Mac 上的 Excel/csv 文件的数据)

round_date(hms(starttime, origin="1904-01-01"), unit="hour")

但这给了我完全相同的错误,所以我想我在错误的函数中指定了原点。下一次尝试是

round_date(hms(starttime), unit="hour"), origin="1904-01-01")

这给了我错误

Error in round_date(hms(starttime), unit = "hour", origin = "1904-01-01") : unused argument (origin = "1904-01-01")

我也试过 base R:

round.Date(as.POSIXct(as.character(starttime), format="%H:%M:%S"), units="hours")

给了我

Error in NextMethod() : generic function not specified

同样在这里,向量到日期的转换是有效的,但是当添加舍入函数时麻烦就开始了。

现在,我完全理解为什么这可能无法使用 lubridate,因为没有与时间关联的日期(因此引擎盖下的计时器无法执行其操作)。虽然我对需要来源的错误消息感到有些困惑,但随后它被忽略了。我不能使用 ymd_hms() 因为日期向量中没有数据。而且我根本无法弄清楚基本 R 函数的错误意味着什么 - 实际上添加了日期(当前日期)。

我最终手动解决了这个问题:

ifelse(minute(hms(starttime))>=30, hour(hms(starttime))+1, hour(hms(starttime)))

有没有办法用函数 lubridate 或基数 R 来做到这一点? 如果没有,有什么想法为什么不呢?在我看来,这应该是可能的。

尝试对现有内容稍作修改:

round(as.POSIXct(starttime, format="%H:%M:%S", tz="UTC"), units="hours")
#[1] "2018-06-27 13:00:00 UTC" "2018-06-27 14:00:00 UTC"
#[3] "2018-06-27 15:00:00 UTC" "2018-06-27 10:00:00 UTC"
#[5] "2018-06-27 11:00:00 UTC" "2018-06-27 12:00:00 UTC"
#[7] "2018-06-27 13:00:00 UTC"
当您使用 as.POSIXct/as.POSIXlt 对象调用 round 时,

R 将自动调度到正确的 round.POSIXt。在您的原始代码中,您强制 round 尝试使用您没有的 Date 对象 - 您有一个 POSIXct datetime 对象。

R中的Date一般只是"year/month/day",没有时间成分,相对于POSIXct是"year/month/day hh/mm/ss/fractional seconds."两者不能直接互换或可比。例如:

> Sys.time() == Sys.Date()
#[1] FALSE
#Warning message:
#Incompatible methods ("Ops.POSIXt", "Ops.Date") for "==" 

(如果您想获得技术知识,Date 存储为自 1970 年 1 月 1 日以来的天数 - 包括小数天数,而 POSIXct 是自 1970 年 1 月 1 日以来的秒数1970-01-01:00:00:00 - 包括小数秒。A POSIXlt 再次不同,它是一系列 list 对象,包含日、月、年、分钟等部分) .