R语言将日期时间变量离散为in-hours与after-hours的实现咨询
日期时间时段分类实现方案
核心逻辑:避开字符型时间的比较缺陷,将时刻换算为可量化的连续数值,通过固定阈值判断区间,完全兼容ifelse的逻辑运算规则。
无第三方包的基础实现
# 原始输入向量 x = c("2015-09-12 03:52:00", "2017-06-15 21:37:28", "2017-04-08 20:44:11") # 1. 转换为标准POSIXct日期时间格式,对齐系统时区 dt = as.POSIXct(x) # 2. 计算每个时间点从当日0点累计的总分钟数 total_min = as.numeric(format(dt, "%H")) * 60 + as.numeric(format(dt, "%M")) + as.numeric(format(dt, "%S")) / 60 # 3. 按规则分类: # after-hours 区间边界:18:30(下午6:30)对应累计1110分钟;次日08:00对应累计480分钟 result = ifelse(total_min >= 1110 | total_min < 480, "after-hours", "in-hours")
使用lubridate包的简化实现
该方式代码可读性更强,时间解析、字段提取效率更高:
# 首次使用需先执行安装:install.packages("lubridate") library(lubridate) # 解析原始时间向量 dt = ymd_hms(x) # 计算每个时间点的当日小时值(含分钟、秒的小数换算) hour_val = hour(dt) + minute(dt)/60 + second(dt)/3600 # 阈值换算为小时单位:18:30 = 18.5小时;08:00 = 8小时 result = ifelse(hour_val >= 18.5 | hour_val < 8, "after-hours", "in-hours")
此前提取时间部分转为字符后无法正常运行ifelse的核心原因,是字符型时间不支持连续区间的数值逻辑比较,若遇到格式不统一的时间字符串(如个位数小时未补零),会直接出现判断偏差。
内容的提问来源于stack exchange,提问作者Riita_Smith
相关产品推荐
相关产品推荐

