如何导入以字符位置作为列定界符的.dat文件?

时间:2019-05-16 15:04:46

标签: pandas dataframe

我正在尝试将.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
...               ...          ...

所以我需要一种导入文件的方法,将这些字符范围指定为列。

1 个答案:

答案 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()