Как прочитать .dta в Python

Я хочу прочитать данные из http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta. Я пробовал ниже,

import pandas as pd
import pyreadstat as pyreadstat

dataframe, meta = pyreadstat.read_dta("http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta")

С этим я получаю ошибку ниже

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pyreadstat/pyreadstat.pyx", line 260, in pyreadstat.pyreadstat.read_dta
  File "pyreadstat/_readstat_parser.pyx", line 1012, in pyreadstat._readstat_parser.run_conversion
pyreadstat._readstat_parser.PyreadstatError: File http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta does not exist!

Я также пытался использовать pandas, но не удалось

>>> Data = pd.read_stata("http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/site-packages/pandas/io/stata.py", line 1898, in read_stata
    reader = StataReader(
  File "/usr/local/lib/python3.9/site-packages/pandas/io/stata.py", line 1066, in __init__
    self._read_header()
  File "/usr/local/lib/python3.9/site-packages/pandas/io/stata.py", line 1095, in _read_header
    self._read_old_header(first_char)
  File "/usr/local/lib/python3.9/site-packages/pandas/io/stata.py", line 1299, in _read_old_header
    raise ValueError(_version_error.format(version=self.format_version))
ValueError: Version of given Stata file is 110. pandas supports importing versions 105, 108, 111 (Stata 7SE), 113 (Stata 8/9), 114 (Stata 10/11), 115 (Stata 12), 117 (Stata 13), 118 (Stata 14/15/16),and 119 (Stata 15/16, over 32,767 variables).

Однако с R я могу без проблем загрузить это, используя данные,

> head(read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta"))
  prate mrate totpart totelg age totemp sole  ltotemp
1  26.1  0.21    1653   6322   8   8709    0 9.072112
2 100.0  1.42     262    262   6    315    1 5.752573
3  97.6  0.91     166    170  10    275    1 5.616771
4 100.0  0.42     257    257   7    500    0 6.214608
5  82.5  0.53     591    716  28    933    1 6.838405
6 100.0  1.82      92     92   7    143    1 4.962845

Не могли бы вы помочь мне загрузить эти данные с помощью Python?

Из вашего первого сообщения об ошибке становится ясно, что pyreadstat не может обрабатывать URL-адреса и ожидает локальный файл. Если вы заранее загрузите файл на свой диск и предоставите pyreadstat только путь к локальному файлу, это сработает.

Amadan 20.03.2022 19:31

Я понимаю. Спасибо за этот указатель. Однако я хочу напрямую прочитать это с URL-адреса. Есть ли способ сделать это для Python?

Brian Smith 20.03.2022 19:37

Нет, библиотека не поддерживает. Лучшее, что вы можете сделать, это создать TemporaryDirectory, загрузить его туда (например, Как скачать файл по HTTP?), прочитать его с помощью pyreadstat, а затем позволить каталогу исчезнуть.

Amadan 20.03.2022 19:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
import requests
import pyreadstat

url = 'http://fmwww.bc.edu/ec-p/data/wooldridge/401k.dta'

def download_file(url):
    local_filename = url.split('/')[-1]
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                f.write(chunk)
    return local_filename

# download_file(url)

df, meta = pyreadstat.read_dta(download_file(url))

Другие вопросы по теме

Похожие вопросы

Как определить функцию лемматизатора в цикле for для одного оператора функции печати в python
Как создать серию, содержащую каждую дату следующего месяца относительно заданной даты в пандах
Pandas - разбить фрейм данных на равные строки и присвоить номер в новом столбце как case_id в порядке возрастания от 1 и т. д
Невозможно импортировать matplotlib в Jupyter Notebook, хотя он выглядит правильно установленным в правильной версии Python
Сравните строки кадра данных pandas
Python гарантирует, что параметр функции всегда является строкой
Используйте раскрывающийся список графиков, чтобы выбрать «Столбец времени» и построить график «Столбец 2» и «Столбец 1» с учетом выбранного времени
Побитовое И для всех целых чисел в кортеже/списке
Почему возникает ошибка, если я импортирую pygame, хотя у меня установлен пакет?
Метод извлечения деталей из клипа YouTube