如何用Matlab绘制24小时商场日均在店人数曲线?
解决24小时商场日均在店人数统计的Matlab方案
我之前处理过类似的24小时营业场所客流统计需求,这个问题的核心难点在于处理跨天的停留记录,再把多年数据按天拆分后计算时段均值。下面是一套便捷的实现流程:
1. 数据导入与格式确认
首先确保你的进店/离店时间被正确识别为Matlab的datetime类型:
% 导入数据(假设是CSV格式,可根据实际文件类型调整) data = readtable('your_data_file.csv'); % 强制转换为datetime格式(如果导入时未自动识别) data.intime = datetime(data.intime, 'InputFormat', 'dd-MM-yyyy HH:mm:ss'); data.outtime = datetime(data.outtime, 'InputFormat', 'dd-MM-yyyy HH:mm:ss');
2. 拆分跨天的停留记录
对于跨天的顾客(比如当天21:50进店,次日8:31离店),我们需要把单条记录拆成两条:一条覆盖当天剩余时长,另一条覆盖次日的停留时长:
% 筛选跨天记录(离店日期晚于进店日期) cross_day_mask = days(data.outtime - data.intime) >= 1; cross_day_data = data(cross_day_mask, :); % 拆分第一条:进店时间到当天23:59:59 split1 = cross_day_data; split1.outtime = datetime(date(split1.intime)) + hours(23) + minutes(59) + seconds(59); % 拆分第二条:次日00:00:00到离店时间 split2 = cross_day_data; split2.intime = datetime(date(split2.outtime)); % 合并拆分后的数据与非跨天数据 processed_data = [data(~cross_day_mask, :); split1; split2];
3. 生成全天的时间刻度(X轴)
我们可以按小时划分时段,也可以用更精细的间隔(比如15分钟),这里以小时为例:
% 生成一天24个小时的起始时间点 time_bins = datetime(0,1,1,0:23,0,0); % 转换为小时数(方便后续插值计算) time_bins_hours = hours(time_bins - datetime(0,1,1));
4. 按日期分组,统计单日各时段在店人数
通过事件法(进店+1,离店-1)计算单日各时段的累计人数,再批量处理所有日期:
% 提取每条记录的日期(用于分组) processed_data.date = date(processed_data.intime); % 初始化数组存储每天的时段人数 all_days_counts = []; % 获取所有唯一日期 unique_dates = unique(processed_data.date); for d = unique_dates' % 筛选当天的所有记录 daily_data = processed_data(processed_data.date == d, :); % 生成事件序列:进店标记+1,离店标记-1 events = [daily_data.intime; daily_data.outtime]; count_changes = [ones(height(daily_data),1); -ones(height(daily_data),1)]; % 按时间排序事件 [sorted_events, idx] = sort(events); sorted_changes = count_changes(idx); % 计算累计在店人数 cumulative_counts = cumsum(sorted_changes); % 转换为时间序列并插值到预设的时段上 ts = timeseries(cumulative_counts, sorted_events); % 用最近邻插值更贴合实际人数变化(整数跳变) daily_counts = interp1(hours(ts.Time - datetime(d)), ts.Data, time_bins_hours, 'nearest', 0); all_days_counts = [all_days_counts; daily_counts]; end
5. 计算日均人数并绘图
最后对所有日期的时段人数取均值,生成可视化图表:
% 计算日均各时段人数 avg_hourly_counts = mean(all_days_counts, 1); % 绘制图表 figure; plot(time_bins_hours, avg_hourly_counts, '-o', 'LineWidth', 1.5); xticks(0:23); xticklabels({'00:00','01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00'}); xlabel('一天中的时间'); ylabel('日均在店人数'); title('24小时商场日均在店人数变化'); grid on;
优化小贴士
- 如果数据量极大,可以用
groupsummary替代循环,提升运行效率; - 时间间隔可灵活调整,比如改成15分钟的话,执行
time_bins = datetime(0,1,1,0:0.25:23.75,0,0);即可; - 若要更精准统计,可以把时间bins设为分钟级,再按小时聚合均值。
内容的提问来源于stack exchange,提问作者Rossonista
相关产品推荐
相关产品推荐

