R:将时间舍入到最接近的小时

时间:2018-06-27 00:02:58

标签: r time rounding lubridate posixct

我有一个带有时间的向量(来自Excel文件)。 它被读为一个因素。 这是它的简短版本/示例:

<input type="email" name="email">
<input type="password" name="password">

我想将所有这些时间四舍五入到军事时间中最接近的小时数,并将小时数提取为整数,然后在尝试使用包或基本函数进行处理时遇到了问题。我使用了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") 似乎可以很好地工作(我确实获得了我的数据作为Period类),但随后将其与hms结合使用会出现错误

round_date

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

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

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

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

这给了我错误

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

我也尝试过R底

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

给我

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

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

现在,我完全理解为什么使用Error in NextMethod() : generic function not specified 可能无法正常工作,因为没有与日期关联的日期(因此,底层的计时器无法执行其操作)。我对错误消息感到有些困惑,因为该错误消息需要一个原点,但随后将其忽略。我无法使用lubridate,因为向量中没有日期数据。而且我根本无法弄清楚基本R函数的错误意味着什么-实际添加的日期(当前日期)在哪里。

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

ymd_hms()

是否可以使用函数ifelse(minute(hms(starttime))>=30, hour(hms(starttime))+1, hour(hms(starttime))) 或基数R执行此操作? 如果没有,为什么没有呢?在我看来,应该有可能。

1 个答案:

答案 0 :(得分:3)

尝试对所拥有的内容进行一些修改:

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"
当您使用round.POSIXt对象调用round时,

R将自动调度到适当的as.POSIXct/as.POSIXlt。在原始代码中,您正在强迫round尝试使用没有的Date对象-您有一个POSIXct日期时间对象。

R中的Date通常只是“年/月/日”,没有时间成分,而POSIXct则是“年/月/日hh / mm / ss /小数秒。”两者不可直接互换或比较。例如:

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

(如果您想获取技术知识,则将Date存储为自1970-01-01起的天数,包括小数天,而POSIXct则是自1970年以来的秒数- 01-01:00:00:00-包括小数秒。POSIXlt又一次不同,它是一系列list对象,其组成部分包括日,月,年,分钟等。 / p>