Как игнорировать ненужные данные при извлечении данных из текстового файла в панды? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть url , который содержит текстовый файл, который я хочу загрузить в кадр данных pandas.Но есть некоторые метаданные вверху, которые я не могу пропустить при синтаксическом анализе, и он возвращает ошибку.

ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 2

Это мой код:

import pandas as pd
data = pd.read_csv('https://fred.stlouisfed.org/data/PERMIT.txt')

Этот код обычноработает для меня, когда нет метаданных наверху.Как пропустить метаданные при загрузке?

Начало файла txt выглядит следующим образом:

Title:               New Private Housing Units Authorized by Building Permits
Series ID:           PERMIT
Source:              U.S. Bureau of the Census, U.S. Department of Housing and Urban Development
Release:             New Residential Construction
Seasonal Adjustment: Seasonally Adjusted Annual Rate
Frequency:           Monthly
Units:               Thousands of Units
Date Range:          1960-01-01 to 2018-03-01
Last Updated:        2018-04-24 7:01 AM CDT
Notes:               Starting with the 2005-02-16 release, the series reflects an increase
                     in the universe of permit-issuing places from 19,000 to 20,000 places.

DATE        VALUE
1960-01-01   1092
1960-02-01   1088
1960-03-01    955
1960-04-01   1016
1960-05-01   1052
1960-06-01    958
1960-07-01    999
1960-08-01    994

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Если вы хотите сохранить заголовок:

import pandas as pd
from pandas.io.common import StringIO as sio
import requests as req

url = 'https://fred.stlouisfed.org/data/PERMIT.txt'
res = req.request('get', url).content.decode()

h, b = res.replace('\r', '').split('\n\n')

s = pd.read_fwf(
    sio(h.replace(':', '')),
    header=None,
    names=['key', 'value']
).ffill().groupby('key').value.apply('\n'.join)

df = pd.read_csv(sio(b), delim_whitespace=True)

Тогда посмотрите нашу полезную работу

print(s.head(), df.head(), sep='\n\n')

key
Date Range                               1960-01-01 to 2018-03-01
Frequency                                                 Monthly
Last Updated                                2018-04-24 701 AM CDT
Notes           Starting with the 2005-02-16 release, the seri...
Release                              New Residential Construction
Name: value, dtype: object

         DATE  VALUE
0  1960-01-01   1092
1  1960-02-01   1088
2  1960-03-01    955
3  1960-04-01   1016
4  1960-05-01   1052
0 голосов
/ 15 мая 2018

Используйте аргумент skiprows, чтобы пропустить ваши метаданные.В вашем случае у вас есть 12 строк:

data = pd.read_csv('https://fred.stlouisfed.org/data/PERMIT.txt', skiprows=12, sep='\s+')
>>> data.head()
   DATE        VALUE
0  1960-01-01   1092
1  1960-02-01   1088
2  1960-03-01    955
3  1960-04-01   1016
4  1960-05-01   1052

В качестве альтернативы скажите read_csv, где находится заголовок с аргументом header (строка 11):

data = pd.read_csv('https://fred.stlouisfed.org/data/PERMIT.txt', header=11, sep='\s+')
>>> data.head()
   DATE        VALUE
0  1960-01-01   1092
1  1960-02-01   1088
2  1960-03-01    955
3  1960-04-01   1016
4  1960-05-01   1052

Если выне знаю, сколько строк пропустить, вы могли бы реализовать стратегию, используемую в этом ответе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...