如何在MATLAB/Python中按分钟统计港口船舶靠泊总用电需求?
高效实现港口分钟级总供电功率计算与可视化
核心思路是用事件差分法:只记录功率发生变化的时间点(船舶抵港/离港),通过累加这些变化量得到各时间点的总功率,再补全分钟级序列。这种方法无需遍历每一分钟,在数据量大时效率远高于逐分钟统计。
Python 实现方案
使用 pandas 处理时间序列,matplotlib 绘图,步骤如下:
1. 准备数据与时间转换
import pandas as pd import matplotlib.pyplot as plt from datetime import datetime # 示例数据:船舶名、抵港时间、离港时间、功率 ship_data = [ ["Ship1", "2019-01-01 02:10", "2019-01-01 22:25", 100], ["Ship2", "2019-01-01 16:35", "2019-01-02 08:10", 150] ] # 转换为DataFrame并解析时间 df = pd.DataFrame(ship_data, columns=["name", "arrival", "departure", "power"]) df["arrival"] = pd.to_datetime(df["arrival"]) df["departure"] = pd.to_datetime(df["departure"]) # 计算所有时间的起始点(最早抵港时间),统一转换为分钟数 start_time = df["arrival"].min() df["arrival_min"] = (df["arrival"] - start_time).dt.total_seconds() // 60 df["departure_min"] = (df["departure"] - start_time).dt.total_seconds() // 60
2. 生成功率变化事件
# 构造事件:抵港+功率,离港-功率 events = [] for _, row in df.iterrows(): events.append({"time_min": row["arrival_min"], "delta": row["power"]}) events.append({"time_min": row["departure_min"], "delta": -row["power"]}) # 转为DataFrame并按时间排序 events_df = pd.DataFrame(events).sort_values("time_min").reset_index(drop=True) # 计算累计功率 events_df["total_power"] = events_df["delta"].cumsum()
3. 补全分钟级序列并绘图
# 生成完整的分钟序列(从起始到最晚离港) max_min = df["departure_min"].max() full_time = pd.Series(range(int(max_min) + 1), name="time_min") # 合并事件数据,填充缺失值(前向填充,保证每个分钟的功率正确) full_power = pd.merge(full_time, events_df, on="time_min", how="left") full_power["total_power"] = full_power["total_power"].ffill().fillna(0) # 绘图 plt.figure(figsize=(12, 6)) plt.plot(full_power["time_min"], full_power["total_power"], linewidth=1.5) plt.xlabel("时间(分钟,相对于最早抵港时间)") plt.ylabel("总供电功率(kW)") plt.title("港口分钟级总供电功率曲线") plt.grid(True, alpha=0.3) plt.show()
MATLAB 实现方案
利用 MATLAB 的 datetime 和 timetable 工具,同样基于事件差分法:
1. 准备数据与时间转换
% 示例数据 ship_names = ["Ship1", "Ship2"]; arrival_times = datetime(["2019-01-01 02:10", "2019-01-01 16:35"]); departure_times = datetime(["2019-01-01 22:25", "2019-01-02 08:10"]); powers = [100, 150]; % 计算起始时间,转换为分钟数 start_time = min(arrival_times); arrival_min = minutes(arrival_times - start_time); departure_min = minutes(departure_times - start_time);
2. 生成功率变化事件
% 构造事件时间和功率变化量 event_times = [arrival_min; departure_min]; delta_powers = [powers; -powers]; % 按时间排序事件 [event_times_sorted, idx] = sort(event_times); delta_powers_sorted = delta_powers(idx); % 计算累计功率 total_power = cumsum(delta_powers_sorted);
3. 补全分钟级序列并绘图
% 生成完整的分钟时间轴 max_min = max(departure_min); full_time = 0:max_min; % 插入功率数据(前向填充) full_power = interp1(event_times_sorted, total_power, full_time, 'previous', 0); % 绘图 figure('Position', [100, 100, 800, 400]) plot(full_time, full_power, 'LineWidth', 1.5) xlabel('时间(分钟,相对于最早抵港时间)') ylabel('总供电功率(kW)') title('港口分钟级总供电功率曲线') grid on grid minor
内容的提问来源于stack exchange,提问作者Ameen Mohamed Bassam
相关产品推荐
相关产品推荐

