如何在R语言中提取字符串列的时间间隔并分析企业营业时间
解决营业时间分析的R语言方案
嘿,作为R新手不用慌,我一步步带你搞定这个问题!咱们先从数据处理的核心逻辑入手,再用代码落地实现,全程都是新手友好的步骤~
第一步:先明确数据结构(模拟示例数据)
首先假设你的数据是类似「企业ID + 每周各天的开门/关门时间」的结构(如果你的实际数据格式不一样,后面我会提调整方法)。先模拟一份示例数据,方便你对照理解:
# 加载需要的包(新手记得先安装:install.packages(c("tidyverse", "hms"))) library(tidyverse) library(hms) # 专门处理时间格式,比纯字符型好操作 # 生成5家企业的一周营业时间数据,包含部分休息日 set.seed(123) # 固定随机结果,方便复现 business_data <- tibble( business_id = rep(1:5, each = 7), # 5家企业,每家7天数据 weekday = rep(c("周一","周二","周三","周四","周五","周六","周日"), 5), open_time = sample(hms(hours = 6:10, minutes = 0), 35, replace = TRUE), # 随机开门时间6-10点 close_time = sample(hms(hours = 12:22, minutes = 0), 35, replace = TRUE) # 随机关门时间12-22点 ) # 给部分企业设置休息日(比如企业3周日休息,企业5周二、周四休息) business_data <- business_data %>% mutate( open_time = case_when( business_id == 3 & weekday == "周日" ~ NA_real_, business_id == 5 & weekday %in% c("周二","周四") ~ NA_real_, TRUE ~ open_time ), close_time = case_when( business_id == 3 & weekday == "周日" ~ NA_real_, business_id == 5 & weekday %in% c("周二","周四") ~ NA_real_, TRUE ~ close_time ) )
第二步:计算每日营业时长,标记14点前闭店的日期
先过滤掉休息日(开门/关门时间为NA的行),然后计算每天的营业时长,同时标记当天是否在14点前闭店:
business_analysis <- business_data %>% # 只保留实际营业的日期 filter(!is.na(open_time) & !is.na(close_time)) %>% mutate( # 计算营业时长(单位:小时) duration_hours = as.numeric(difftime(close_time, open_time, units = "hours")), # 判断当天是否14点前闭店 closes_before_14 = close_time < hms(hours = 14) )
第三步:按企业分组计算平均时长,筛选目标企业
这一步是核心:按企业ID分组,计算实际营业日的平均时长,同时标记两种符合条件的情况(有某天14点前闭店、平均时长不足4小时):
business_summary <- business_analysis %>% group_by(business_id) %>% summarise( total_open_days = n(), # 实际营业天数 avg_duration_hours = mean(duration_hours), # 实际营业日的平均时长 has_closes_before_14 = any(closes_before_14), # 是否存在某天14点前闭店 avg_duration_below_4 = avg_duration_hours < 4 # 平均时长是否不足4小时 ) %>% ungroup() # 筛选出符合任意一个条件的企业 target_businesses <- business_summary %>% filter(has_closes_before_14 | avg_duration_below_4)
新手注意事项
- 如果你的时间是字符型(比如"08:30"),可以用
hms::as_hms()转换成时间格式,这样才能做比较和计算时长 - 如果你的数据结构是「企业ID + 每周营业时间字符串」(比如"周一至周五 08:00-18:00,周六 09:00-14:00"),那需要先拆分字符串提取每天的时间,这时候可以用
tidyr::separate_rows()或者正则表达式处理,有需要可以再细化 - 运行代码前记得先安装需要的包:
install.packages(c("tidyverse", "hms"))
现在你可以把自己的实际数据替换掉示例数据,按照这个流程跑一遍就能得到你要的结果啦~
内容的提问来源于stack exchange,提问作者R-tist
相关产品推荐
相关产品推荐

