我正在尝试将.dat文件导入熊猫数据框,但是由于原始文件的格式,我遇到了问题。
数据如下:
101603550001878TAVG 959 1 1019 1 1179 1 1679 1 2049 1 2309 1 2559 1 2749 1 2389 1-9999 Q1 1439 1 1219 1
101603550001879TAVG 1249 1 1239 1 1289 1 1619 1 1629 1 2339 1 2469 1 2579 1 2309 1 1819 1 1519 1 969 1
101603550001880TAVG 1029 1 1179 1 1309 1 1589 1 1779 1 2139 1 2649 1 2639 1 2359 1 2129 1 1639 1 1359 1
101603550001931TAVG-9999 1039 1-9999 -9999 1919 1 2459 1-9999 2669 1 2229 1 1999 1 1619 1 1129 1
101603550001932TAVG 1079 1 1049 1-9999 1489 1 1909 1-9999 2359 1-9999 2509 1-9999 -9999 -9999
这里的每一列不是由特定的分隔符指定,而是由字符范围指定;
Variable Columns Type
-------- ------- ----
ID 1-11 Integer
YEAR 12-15 Integer
ELEMENT 16-19 Character
VALUE1 20-24 Integer
DMFLAG1 25-25 Character
QCFLAG1 26-26 Character
DSFLAG1 27-27 Character
... ... ...
所以我需要一种导入文件的方法,将这些字符范围指定为列。
答案 0 :(得分:0)
由于Python的索引为0,因此您想使用pd.read_fwf()
并对列号进行一些处理:
doc = XDocument.Load("C:\\Documents\\analyse\\InterBatch.ini");
XElement rootNode = doc.Element(Constant.NODE_CONFIGURATION);
fichierInstall.Base = this.ReadNodeBase(rootNode, Constant.NODE_BASE);
fichierInstall.Log = this.ReadNodeLog(rootNode, Constant.NODE_LOG);
fichierInstall.PathEntree = this.ReadNodePathEntree(rootNode, Constant.NODE_PATH_ENTREE);
fichierInstall.PathSortie = this.ReadNodePathSortie(rootNode, Constant.NODE_PATH_SORTIE);
收益:
import pandas as pd
import io
mapping = io.StringIO('''
Variable Columns Type
ID 1-11 Integer
YEAR 12-15 Integer
ELEMENT 16-19 Character
VALUE1 20-24 Integer
DMFLAG1 25-25 Character
QCFLAG1 26-26 Character
DSFLAG1 27-27 Character
''')
mapping = pd.read_csv(mapping, sep=r'\s{2,}', engine='python')
colspecs = [list(map(int,i.split('-'))) for i in mapping['Columns'].tolist()]
colspecs = [[i[0]-1,i[1]] for i in colspecs]
df = pd.read_fwf('test.dat', header=None, colspecs=colspecs)
df.columns = mapping['Variable'].tolist()