我有到达港口停泊时消耗电力的船舶的到达和出发日期。我只是想累积他们的功率需求,以了解端口每分钟消耗的总功率。
例如:
Ship1 于 2019 年 1 月 1 日 02:10 到达,于 2019 年 1 月 1 日 22:25 出发,需要 100 kW。
Ship2 于 2019 年 1 月 1 日 16:35 到达,于 2019 年 2 月 1 日 08:10 出发,需要 150 kW。 等等。
我想知道端口向它们提供所需的功率,例如以分钟为单位的时间。因此,我可以在 y 轴上得到港口向船舶提供的总功率(以千瓦为单位),在 y 轴上得到以分钟为单位的时间。 有没有一种聪明的方法可以在 MATLAB 或 Python 中做到这一点?非常感谢提前
无论使用哪种编程语言,其想法都是简单地将差异数组转换为原始数组。
具体来说,假设数据是用 Python 构建的
data = [
(datetime(2019, 1, 1, 2, 10), datetime(2019, 1, 1, 22, 25), 100),
(datetime(2019, 1, 1, 16, 35), datetime(2019, 1, 2, 8, 10), 150)
]
以下代码获取船舶到达或离开时的时间和功率,
from itertools import accumulate
from collections import defaultdict
import matplotlib.pyplot as plt
# Compute changes of power
dic = defaultdict(lambda: int)
for arrive, depart, power in data:
dic[arrive] += power
dic[depart] -= power
# Sort by date
x, y = zip(*sorted(dic.items(), key=lambda i: i[0]))
# Convert to original power
y = accumulate((0,) + y)
# Plot
plt.plot(
[t for t in x for _ in range(2)],
[p for p in y for _ in range(2)][1:-1],
'o-'
)
结果:
或者,如果您需要每一分钟的力量,那就
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(data, columns=('arrive', 'depart', 'power'))
xmin = df.arrive.min() - np.timedelta64(4, 'h')
xmax = df.depart.max() + np.timedelta64(4, 'h')
x = np.arange(xmin, xmax, np.timedelta64(1, 'm'))
y = np.zeros(x.shape)
np.add.at(y, (df.arrive - xmin).to_numpy().astype('timedelta64[m]').astype(int), +df.power)
np.add.at(y, (df.depart - xmin).to_numpy().astype('timedelta64[m]').astype(int), -df.power)
y = np.cumsum(y)
plt.plot(x, y, 'o-')
结果: