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
对象,包含日、月、年、分钟等部分) .
我有一个时间向量(来自 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
对象,包含日、月、年、分钟等部分) .