You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:41:04