我必须为我们在工作中使用的数据文件编写一个解析器。我选择 Pandas 是因为我读过它的速度非常快,而且性能是它的一大重点。作为旁注,我在今天之前从未使用过 Pandas。
据我了解,我需要告诉 Pandas 我的标题行在类似 CSV 的文件中的位置。但是在实际数据开始之前,工作中的文件可能具有可变数量的行。
例子:
Software :SomeCorpSoft 2.3.4
Measurement Name;default
Created;2017-11-30T11:42:09Z
Scan Type;Threshold scan
Serial Number;A-SERIAL-NUM-1234
Sensor Nickname;
Trend Count;1
Trigger Level;0
Trigger Holdoff;0
start;0
end ;0
F1; 44.12; H; 8;
Time;F1 ;V 1 ;Hp 1 ;C 1 ;P 1 ;V 2 ;Hp 2 ;C 2 ;P 2 ;V 3 ;Hp 3 ;C 3 ;P 3 ;V 4 ;Hp 4 ;C 4 ;P 4 ;V 5 ;Hp 5 ;C 5 ;P 5 ;V 6 ;Hp 6 ;C 6 ;P 6 ;V 7 ;Hp 7 ;C 7 ;P 7 ;V 8 ;Hp 8 ;C 8 ;P 8 ;
0;13.448671;349.458099365;0;7.72320135575;-105.609801195;8.54580983665;-15.5168133183;0.0477259658688;101.686749515;4.46981738574;152.711715748;0.0728701513916;77.1428145399;17.8438225472;-163.940792731;0.95931622744;48.4915601658;0.525170185762;-85.3977558257;0.255517896038;-58.4781138655;2.0410204213;131.266863348;0.291022526301;-145.942080277;12.7706899744;-150.335793306;1.3724642398;-161.919972567;5.3790623792;-148.609825665;0.512542366745;-177.811876518;
所以在这个例子中,我的实际标题在第 14 行(如果它忽略空行,则为第 13 行,对此不确定),它以Time开头(这是一个常数,所以也许某种 lambda 方法可以考虑到这一点?)
但我还需要前面的几行,以便在数据库中形成不同的对象(例如,“ Created; ”给了我测量的时间)。
然后我必须为每个标题创建对象实例。它们确实与下面的数据一致,例如:
Time -> 0
F1 -> 13.448671
V1 -> 349.458099365
... so on...
所以我有
import pandas as pd
df = pd.read_csv(file_dir)
for i in df.values:
for x in i:
if "Software" in x:
software_ver = x.split(':')[1]
if "Time" in x:
headers = x
但这感觉“便宜”?可能有一种 Pandas 方法可以做到这一点。在那之后,我计划在标题之后对每一行进行压缩,因为它们都匹配,这样我就可以将值与标题配对,但同样,这可能是一种更好的方法,更有效。
这些文件可能有几十万行,我必须为每一行的每个标题元素创建一个对象实例。我们当前的解析器需要几分钟的时间,但我需要把时间缩短。
MYYA
相关分类