Как импортировать файл .dat с символьными позициями в качестве разделителей столбцов? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь импортировать файл .dat в кадр данных pandas, однако у меня возникают проблемы из-за форматирования исходного файла.

Данные выглядят так:

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 голосов
/ 16 мая 2019

Вы хотите использовать pd.read_fwf() и выполнить некоторые операции с номерами столбцов, так как Python имеет 0-index:

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

Урожайность:

            ID  YEAR ELEMENT  VALUE1  DMFLAG1  QCFLAG1  DSFLAG1
0  10160355000  1878    TAVG     959      NaN      NaN      1.0
1  10160355000  1879    TAVG    1249      NaN      NaN      1.0
2  10160355000  1880    TAVG    1029      NaN      NaN      1.0
3  10160355000  1931    TAVG   -9999      NaN      NaN      NaN
4  10160355000  1932    TAVG    1079      NaN      NaN      1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...