使用lubridate处理visit_datetime时段划分问题求助
问题原因与解决办法
你的代码结果全为2,核心问题是带日期的datetime类型和纯时间period类型直接比较逻辑不成立:
visit_datetime是包含日期+时间的datetime对象,内部存储为从起始基准日(如1970-01-01)到该时刻的总秒数,数值极大;hm("08:00")生成的是仅代表8小时时长的period对象,内部存储为28800秒。
直接对比时,所有visit_datetime的秒数都远大于28800,也远大于hm("20:00")的72000秒,所以条件永远不满足,全部返回2。
解决方法
方法1:提取时间部分后再比较(精确到分钟)
先把datetime转成纯时间格式,再和目标时间区间对比:
library(lubridate) # 提取datetime中的时间部分为hms类型 visit_time <- as_hms(visit_datetime) # 按区间赋值(08:00含-20:00不含为1,其余为2) tijd_presentatie <- ifelse(visit_time >= hm("08:00") & visit_time < hm("20:00"), 1, 2)
方法2:用小时/分钟函数直接判断(更高效)
如果不需要精确到分钟,只按小时判断:
tijd_presentatie <- ifelse(hour(visit_datetime) >= 8 & hour(visit_datetime) < 20, 1, 2)
如果需要精确到分钟(比如8:00整算1,19:59算1,20:00整算2),可以转成分钟数对比:
tijd_presentatie <- ifelse( (hour(visit_datetime)*60 + minute(visit_datetime)) >= 8*60 & (hour(visit_datetime)*60 + minute(visit_datetime)) < 20*60, 1, 2 )
内容的提问来源于stack exchange,提问作者Researchervo
相关产品推荐
相关产品推荐

