R语言格式化24小时制时间变量 实现不同区间观测值筛选
R中24小时制时间变量的排序与筛选解决方案
问题原因
- 原始
Start.Time为字符型变量,字符串默认按字典序比较:一位数小时(1-9)开头的字符串首字符是数字1-9,两位数小时(10-23)开头的字符串首字符是1/2,ASCII码中"9"大于"1",因此会出现"9:00:00" > "10:00:00"的逻辑错误。 - 第二段代码的判断条件添加了
AM后缀,但原始数据为24小时制格式,没有AM/PM标识,完全无法匹配到有效观测值,结果自然不符合预期。
解决方案
方法1:使用hms包(推荐,专门处理时分秒数据)
hms是R中专门处理时间类数据的轻量包,转换后自动支持时间逻辑的比较运算:
# 首次使用先安装包 install.packages("hms") library(hms) # 将Start.Time转换为hms时间格式 dataset1$Start.Time <- as_hms(dataset1$Start.Time) # 按需求筛选统计,这里用%in%简化多值判断,不需要加AM/PM后缀 RLLtoMist9.10 <- sum( dataset1$Trail.Segment %in% c(52, 55) & dataset1$Start.Time >= as_hms("09:00:00") & dataset1$Start.Time < as_hms("10:00:00"), na.rm = TRUE )
方法2:基础R转POSIXct格式(无需额外安装包)
给时间补一个默认日期,转换为日期时间格式后即可按时间逻辑比较:
# 转换为POSIXct格式,format参数匹配原始24小时制时间结构 dataset1$Start.Time <- as.POSIXct(dataset1$Start.Time, format = "%H:%M:%S") # 筛选时将判断值也转为相同格式 RLLtoMist9.10 <- sum( dataset1$Trail.Segment %in% c(52, 55) & dataset1$Start.Time >= as.POSIXct("09:00:00", format = "%H:%M:%S") & dataset1$Start.Time < as.POSIXct("10:00:00", format = "%H:%M:%S"), na.rm = TRUE )
方法3:补前导零(临时快速解决)
给一位数小时补前导零,让所有时间字符串统一为HH:MM:SS的8位格式,此时字典序和时间逻辑序完全一致,直接用字符串比较也能得到正确结果:
# 给长度为7的时间字符串(H:MM:SS)补前导零 dataset1$Start.Time <- ifelse( nchar(dataset1$Start.Time) == 7, paste0("0", dataset1$Start.Time), dataset1$Start.Time ) # 直接按字符串比较,注意判断值也要补前导零 RLLtoMist9.10 <- sum( dataset1$Trail.Segment %in% c(52, 55) & dataset1$Start.Time >= "09:00:00" & dataset1$Start.Time < "10:00:00", na.rm = TRUE )
内容的提问来源于stack exchange,提问作者caarma01
相关产品推荐
相关产品推荐

