Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:四舍五入到最近的小时_R_Time_Rounding_Lubridate_Posixct - Fatal编程技术网

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

R:四舍五入到最近的小时,r,time,rounding,lubridate,posixct,R,Time,Rounding,Lubridate,Posixct,我有一个时间向量(来自Excel文件)。 它作为一个因素被读入。 这是一个简短的版本/示例: starttime <- factor(c("12:55:00", "13:45:00", "14:30:00", "10:00:00", "10:40:00", "12:00:00", "12:30:00")) hms本身似乎工作得很好(我确实得到了一个我的数据作为上课时间),但如果将其与round_date结合使用,则会产生错误 Error in as.POSIXct.numeric(x)

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

starttime <- factor(c("12:55:00", "13:45:00", "14:30:00", "10:00:00", "10:40:00", "12:00:00", "12:30:00"))
hms
本身似乎工作得很好(我确实得到了一个我的数据作为上课时间),但如果将其与
round_date
结合使用,则会产生错误

Error in as.POSIXct.numeric(x) : 'origin' must be supplied
Error in round_date(hms(starttime), unit = "hour", origin = "1904-01-01") : unused argument (origin = "1904-01-01")
然后我尝试了以下方法(1904年,因为它是Mac上Excel/csv文件中的数据)

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

round_date(hms(starttime), unit="hour"), origin="1904-01-01")
这给了我错误

Error in as.POSIXct.numeric(x) : 'origin' must be supplied
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()
,因为向量中没有日期数据。而且我根本不知道base R函数的错误是什么意思——实际添加了日期(当前日期)

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

ifelse(minute(hms(starttime))>=30, hour(hms(starttime))+1, hour(hms(starttime)))
有没有一种方法可以通过函数
lubridate
或base 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
通常只是“年/月/日”,没有时间成分,而
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以来的秒数(包括分数秒)。a
POSIXlt
也不同,是一系列
列表
对象,其中包含日期、m的部分。)月、年、分钟等)。

开始时间如何转变为测试时间?是打字错误吗?您在实际代码中是否也犯了同样的错误?
round(as.POSIXct(开始时间,格式=“%H:%M:%S”,tz=“UTC”),units=“hours”)
-R将自动分派到适当的
回合。POSIXt
-您正在强制它尝试使用
日期
对象,而您没有-您有一个
日期时间
@Moody\u Mudskipper道歉,这是一个输入错误,不在我的实际代码中。我的数据比这里发布的更复杂,因此在制作他举了一个向量的例子,我没能更新对象名。现在更新了。@LateMail哈,是的,这是有效的…你能把它作为一个正确的答案发布给我吗?也许还包括
日期
日期时间
对象之间的区别?我没听说过后者,谷歌也没有太大的帮助。但是-为什么使用
round.Date()
POSIXct()
?相关的后续问题:您的解决方案和我的
round.Date(as.POSIXct(as.character(starttime),format=“%H:%M:%s”),units=“hours”)之间有什么区别?