3

我试图通过以下代码从谷歌金融中获取数据:

import pandas_datareader.data as wb
import datetime as dt
start = dt.datetime(2015, 1, 1)
end = dt.datetime(2017, 1, 1)

dt = wb.DataReader('FB', 'google', start, end)
dt.head()

我得到了这个。

UnicodeDecodeError:“utf-8”编解码器无法解码位置 24697 中的字节 0xa0:无效的起始字节

但是,如果我将“google”更改为“yahoo”(改用 yahoo Finance),它就可以正常工作。那么它有什么问题呢?

4

1 回答 1

3

这里有一个未解决的问题。

下面是一个快速修复,从源代码移植,削减它并进行一些细微的调整。

我认为问题在于返回的正文requests.get()和读取结果字节。(回溯同意这一点。)例如,尝试data = requests.get(url).content(获取字节);这将失败。下面,data = requests.get(url).text作品。

我真的没有严格测试过这个,但谷歌 API 似乎工作正常。例如,由 生成的导出链接url目前确实可以正常工作。

import datetime
import requests
from io import StringIO
from pandas.io.common import urlencode
import pandas as pd

BASE = 'http://finance.google.com/finance/historical'


def get_params(symbol, start, end):
    params = {
        'q': symbol,
        'startdate': start.strftime('%Y/%m/%d'),
        'enddate': end.strftime('%Y/%m/%d'),
        'output': "csv"
    }
    return params


def build_url(symbol, start, end):
    params = get_params(symbol, start, end)
    return BASE + '?' + urlencode(params)


start = datetime.datetime(2010, 1, 1)
end = datetime.datetime.today()
sym = 'SPY'
url = build_url(sym, start, end)

data = requests.get(url).text
data = pd.read_csv(StringIO(data), index_col='Date', parse_dates=True)

print(data.head())
#               Open    High     Low   Close     Volume
# Date
# 2017-11-30  263.76  266.05  263.67  265.01  127894389
# 2017-11-29  263.02  263.63  262.20  262.71   77512102
# 2017-11-28  260.76  262.90  260.66  262.87   98971719
# 2017-11-27  260.41  260.75  260.00  260.23   52274922
# 2017-11-24  260.32  260.48  260.16  260.36   27856514

编辑:这个问题应该在 pandas_datareader 的 0.6.0 版上得到解决。如果没有,请按照 bashtage 的要求重新打开它。

于 2017-12-01T15:30:43.163 回答