假设我有这样一个数据帧(笔记本文本版本跟在图片后面):
A为到达航班(落地),D为离港航班(起飞)。 航母和FltReg是一架飞机。。它到达和离开一个机场,然后又回到同一个机场。。几小时或几天之后。 Acft是一种飞机。在
到港和离港需要进行匹配,以便生成的数据帧可用于计算和绘制甘特图(开始时间即到达时间和结束时间,即出发时间。。。飞机在地面的时间。)
数据通常将持续7天的航班时刻表和更多的航空公司。。约3000行,持续7天。。。来自sql server数据库
from io import StringIO
import pandas as pd
dfstr = StringIO(u"""
ID;Car;FltNo;Acft;FltReg;E_FltType;Rtg;STADDtTm;ArrDep
0;EK;376;77W;A6ECI;T/A;DXB-BKK-DXB;03/05/2017 12:50;A
1;EK;377;77W;A6ECI;T/A;DXB-BKK-DXB;03/05/2017 15:40;D
2;EK;384;380;A6EDL;T/S;DXB-BKK-HKG;02/05/2017 12:15;A
3;EK;384;380;A6EDL;T/S;DXB-BKK-HKG;02/05/2017 14:00;D
4;EK;385;380;A6EDL;T/A;HKG-BKK-DXB;02/05/2017 23:45;A
5;EK;385;380;A6EDL;T/A;HKG-BKK-DXB;03/05/2017 01:15;D
54;VZ;920;320;HSVKA;DEP ONLY;BKK-HPH;01/05/2017 11:15;D
55;VZ;921;320;HSVKA;ARR ONLY;HPH-BKK;01/05/2017 15:25;A
56;VZ;602;320;HSVKA;DEP ONLY;BKK-CNX;01/05/2017 16:35;D
57;VZ;603;320;HSVKA;ARR ONLY;CNX-BKK;01/05/2017 19:45;A
58;VZ;602;320;HSVKA;DEP ONLY;BKK-CNX;02/05/2017 11:15;D
59;VZ;603;320;HSVKA;ARR ONLY;CNX-BKK;02/05/2017 14:25;A
60;VZ;820;320;HSVKA;DEP ONLY;BKK-HKT;03/05/2017 07:05;D
61;VZ;821;320;HSVKA;ARR ONLY;HKT-BKK;03/05/2017 15:45;A
62;VZ;828;320;HSVKA;DEP ONLY;BKK-HKT;03/05/2017 18:20;D
63;VZ;829;320;HSVKA;ARR ONLY;HKT-BKK;03/05/2017 21:50;A
64;VZ;600;320;HSVKB;DEP ONLY;BKK-CNX;01/05/2017 06:10;D
65;VZ;601;320;HSVKB;ARR ONLY;CNX-BKK;01/05/2017 09:20;A
66;VZ;606;320;HSVKB;DEP ONLY;BKK-CNX;01/05/2017 09:50;D
67;VZ;607;320;HSVKB;ARR ONLY;CNX-BKK;01/05/2017 13:00;A
""")
df = pd.read_csv(dfstr, sep=";", index_col='ID')
df
问题1:如何将上述数据帧转换为下面的数据帧。
如果汽车和飞机是一样的,我要把这个转换成相同的行。。例如,对于ID 0,EK376 A6ECI于5月3日12:50到达,并在5月3日15:40作为ID 1离开,EK377 A6ECI。。。类似于ID2和3,ID4和5。。。这是3种不同的飞机,以粗体突出显示。很多其他航班在这之间。。。接下来是ID54,这是一个VZ航空母舰注册HSKVA。。。它先离开,所以它应该在自己的一排。。。然后它到达ID55,以ID56离开,再以ID57到达,以ID58离开。在
^{pr2}$如你所见。。。我们可以看到ID0和ID1在同一行中匹配。。。因此,更容易看出飞机在地面(即在机场)有多长时间。。。从12:50到15:40(2小时50分钟)。。。剩下的航班就这样了。在
问题2:用上述结果数据框制作甘特图
生成的数据帧将用于生成甘特图。在
这是一个例子:HSKVA(VZ飞行)将有自己的排。。。11:15先出发(甘特图从10:15(出发前1小时,因为没有到达)到11:15。然后在同一行绘制甘特图,时间为15:25至16:35、19:45至11:15、14:25至07:05、15:45至18:20、21:50至22:50(航班到达后一小时,因为没有起飞)。想到了matplotlib的断条
HSKVB将有自己的甘特图行。。。等等。在
每艘航母/飞机都在自己的行上登记,以便于查看。在
问题1
对设置的一个快速更改是,我没有将
ID
设置为index_col
,因为我想在groupby().shift
中快速使用它的值。所以从修改后的read_csv
开始:解决方案的很大一部分是确保df按}排序(因为前两个是唯一标识符,最后一个是主排序值)。在
^{pr2}$Car
、FltReg
、和{现在我们是逻辑的主要部分了。我将把df分为到港和离港,两者的连接方式是通过一个移位的ID。也就是说,对于任何(
Car
,FltReg
)分区,我知道将给定的'a'行与紧随其后的'D'行配对。我们需要完整的数据。在让我们生成移位的ID:
现在使用一个“A”过滤的df和一个“D”过滤的df,我将把它们连接在一起。到达(左数据集)由原始的
ID
键控,离港(右数据集)由我们刚刚生成的NextID
键控。在注意,这些列现在将以
1
(左)和2
(右)作为后缀。在此时,这个新的数据框}必须合并在一起,这样您就可以根据组合的版本对所有行进行排序。在
df_display
拥有它所需的所有行,但是它在最终显示中没有很好的排序。为了实现这一点,您需要再次使用sort_cols
列表,但是合并了每个列的版本,这些版本将各自的左版本和右版本放在一起。例如,Car1
和{熊猫的
combine_first
就像是凝聚。在我们快完成了。现在,
df_display
有我们不需要的无关列。我们可以只选择我们想要的列,基本上是原始列列表的两个副本cols
。在我检查了(在csv导出中,以便我们可以看到广泛的数据集)这与您的示例相匹配。在
问题2
好的,所以如果您在https://matplotlib.org/examples/pylab_examples/broken_barh.html处玩代码,您可以看到
broken_barh
是如何工作的。这一点很重要,因为我们必须使数据适合这种结构才能使用它。broken_barh
的第一个参数是要绘制的元组列表,每个元组都是一个(开始时间,持续时间)。在对于matplotlib,开始时间必须采用其特殊的日期格式。{dateso23}我们要用dateso23来转换。最后,持续时间似乎是以天为单位的。在
因此,如果HSVKA在2017-05-01 15:25:00到达并且在地面上停留了70分钟,那么
broken_barh
需要绘制元组(mdates.date2num(Timestamp('2017-05-03 15:25:00')), 70 minutes in day units or 0.04861)
。在所以第一步是从问题1得到{},格式如下。我们现在只需要关注四列
'Car1', 'FltReg1', 'STADDtTm1', 'STADDtTm2'
。在看起来像
当到达或离开时有
NaN
s。归责于这些是相当简单的。我注意到在你的报告中,你希望有一个小时的缓冲时间,在任何一个地方丢失。所有这些直接的争论都是:现在看起来像
现在做一个dict,其中每个键都是唯一的
Car_FltReg
,每个值都是一个元组列表(如前所述),这些元组可以被输入broken_barh
。在所以
dict_gantt
看起来像非常适合
broken_barh
。现在全是matplotlib的疯狂。在准备broken_barh
内容的核心逻辑之后,其他一切都只是费劲的记号格式等。如果您在matplotlib中定制了一些东西,那么这些东西应该很熟悉,我不会解释太多。在这是最终的输出。在
相关问题 更多 >
编程相关推荐