一、 清空工作空间和命令行
clear;
clc;
`clear`:清除当前工作区中的所有变量,以确保没有旧的数据干扰。
`clc`:清空命令行窗口,使输出更清晰。
二、 设定输入文件路径和输出文件夹
input_file = 'your_data.xlsx'; % 替换为你的实际文件名
output_folder = 'output'; % 输出文件夹名,可根据需要调整
```
- `input_file`:输入 Excel 文件的路径。需要替换为实际的文件名。
- `output_folder`:指定结果保存的文件夹名称。
三、 创建输出文件夹(如果不存在)
if ~exist(output_folder, 'dir')
mkdir(output_folder);
end
- 检查 `output_folder` 是否存在,如果不存在,则使用 `mkdir` 创建文件夹,确保后续的输出文件有地方保存。
四、 读取 Excel 文件的选定列
opts = detectImportOptions(input_file);
opts.SelectedVariableNames = {'SerialNumber', 'Date', arrayfun(@(x) ['P', num2str(x)], 1:96, 'UniformOutput', false)};
data = readtable(input_file, opts);
`detectImportOptions(input_file)`:检测 Excel 文件中的导入选项,方便自定义读取设置。
`opts.SelectedVariableNames`:指定需要读取的列,包括 `SerialNumber`、`Date` 和 `P1` 到 `P96`,使用 `arrayfun` 生成从 `P1` 到 `P96` 的变量名数组。
`readtable(input_file, opts)`:根据指定的导入选项 `opts` 读取 Excel 文件中的数据,并将其存储为表格 `data`。
五、 提取唯一的用户编号
user_ids = unique(data.SerialNumber);
`unique(data.SerialNumber)`:提取 `SerialNumber` 列中所有唯一的用户编号,用于后续对每个用户的数据进行单独处理。
六、月份名称
month_names = {'1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'};
定义一个包含 12 个月份名称的单元格数组,用于在输出的 Excel 表格中作为月份列的内容。
七、 循环处理每个用户
for i = 1:length(user_ids)
user_id = user_ids(i);
开始循环遍历每一个用户,`i` 是循环索引,`user_id` 是当前循环中的用户编号。
八、筛选当前用户的数据
user_data = data(data.SerialNumber == user_id, :);
通过逻辑索引提取当前用户的数据,即从 `data` 表格中选择 `SerialNumber` 等于 `user_id` 的所有行。
九、 初始化月平均负荷数据
monthly_avg_load = zeros(12, 96);
初始化一个 12×96 的矩阵 `monthly_avg_load`,用于存储每个月的平均负荷数据。矩阵的行表示月份,列表示每小时的数据点。
十、 按月计算平均负荷
for month = 1:12
% 筛选出该月的数据
month_data = user_data(month(user_data.Date) == month, 7:end); % 7:end获取P1到P96列
1.开始循环遍历 12 个月的数据
`month(user_data.Date) == month`:使用 `month` 函数从 `Date` 列中提取月份并匹配当前的 `month` 值,筛选该月的数据。
`7:end`:选择从第 7 列(即 `P1`)到最后一列(即 `P96`)的数据,这些列是每小时的数据点。
2.计算每个小时点的月平均值
monthly_avg_load(month, :) = mean(month_data{:,:}, 1, 'omitnan');
end
`mean(month_data{:,:}, 1, 'omitnan')`:计算筛选出的月数据的平均值,按列计算(即按每个小时),并忽略 `NaN` 值,避免异常数据影响计算结果。
十一、 创建表格,将计算结果转换为表格形式并添加列名
variable_names = arrayfun(@(x) ['P', num2str(x)], 1:96, 'UniformOutput', false);
output_table = array2table(monthly_avg_load, 'VariableNames', variable_names);
`arrayfun`:生成从 `P1` 到 `P96` 的列名称数组。
`array2table(monthly_avg_load, 'VariableNames', variable_names)`:将计算的月平均负荷数据转换为表格,并指定列名称为 `P1` 到 `P96`。
十二、 添加月份列
output_table.('月份') = month_names';
output_table = movevars(output_table, '月份', 'Before', 'P1'); % 将月份列移到数据前面
`output_table.月份 = month_names'`:添加一个 `月份` 列,内容为 `month_names`,按行排列。
`movevars(output_table, '月份', 'Before', 'P1')`:将 `月份` 列移动到表格的最前面。
十三、 生成 Excel 文件名并写入数据
output_filename = fullfile(output_folder, ['用户_', num2str(user_id), '.xlsx']);
writetable(output_table, output_filename);
`fullfile(output_folder, ['用户_', num2str(user_id), '.xlsx'])`:生成输出文件名,包含输出路径和当前用户编号。
`writetable(output_table, output_filename)`:将表格 `output_table` 写入指定的 Excel 文件。
十四、 显示导出成功的信息
disp(['用户 ', num2str(user_id), ' 的月平均负荷数据已成功导出为 Excel 文件!']);
end
- 输出信息,提示该用户的月平均负荷数据已成功导出为 Excel 文件。