使用Python将BLS API数据输入Microsoft Excel

时间:2016-04-18 21:33:41

标签: python json excel

首先,谢谢你的帮助。我非常擅长在stackoverflow上发布问题。如果我把它弄得太混乱或没有采用有效的格式,请告诉我。

我首先在BLS网站上使用示例Python代码,但是当我尝试运行它时它不起作用。这是下面的代码。

import requests
import json
import prettytable
headers = {'Content-type': 'application/json'}
data = json.dumps({"seriesid": ['CUUR0000SA0','SUUR0000SA0'],"startyear":"2011", "endyear":"2014"})
p = requests.post('http://api.bls.gov/publicAPI/v1/timeseries/data/', data=data, headers=headers)
json_data = json.loads(p.text)
for series in json_data['Results']['series']:
x=prettytable.PrettyTable(["series id","year","period","value","footnotes"])
seriesId = series['seriesID']
for item in series['data']:
    year = item['year']
    period = item['period']
    value = item['value']
    footnotes=""
    for footnote in item['footnotes']:
        if footnote:
            footnotes = footnotes + footnote['text'] + ','
    'if 'M01' <= period <= 'M12':'
        x.add_row([seriesId,year,period,value,footnotes[0:-1]])
output = open(&quot;c:\\temp\\&quot; + seriesId + &quot;.txt&quot;,&quot;w&quot;)
output.write (x.get_string())
output.close()

它出现以下错误。

  File "C:\Users\Benjamin\Documents\Website\Python\BLS Second.py", line 20
    'if 'M01' <= period <= 'M12':'
       ^
SyntaxError: invalid syntax
[Finished in 0.1s with exit code 1]

之后我将其修改为下面的代码,这样我至少可以检索数据。

 import json
 import prettytable
 import xlwt
 import requests
 headers = {"Content-Type": "application/json"}
 data = json.dumps({"seriesid": ["LAUDV061124400000003"], "startyear": "2010", "endyear": "2015"})
 p = requests.post("http://api.bls.gov/publicAPI/v1/timeseries/data/"data = data, headers = headers)
 json_data = json.loads(p.text)

然后我尝试使用以下方法将结果放入Excel电子表格中:

workbook = xlwt.Workbook(encoding="utf-8")
sheet1 = workbook.add_sheet("Python Sheet1")

sheet1.write(0,0,p.text)

workbook.save("Pythonspreadsheet1.xls")

print ("Workbook Created") 

它有效,但它将下面的所有JSON放在一个单元格中。

{ “状态”: “REQUEST_SUCCEEDED”, “RESPONSETIME”:321, “消息”:[], “结果”:{ “系列”: [{ “seriesID”: “LAUDV061124400000003”, “数据”:[{ “年”: “2014”, “时期”: “M12”, “periodName”: “腊”, “值”: “4.6”,“脚注“:[{”code“:”R“,”text“:”数据可能于2016年4月15日修订。“}]},{”年“:”2014“,”期间“:”M11“, “periodName”:“November”,“value”:“5.1”,“footnotes”:[{“code”:“R”,“text”:“数据可能于2016年4月15日修订。”}}} ,{ “年”: “2014”, “时期”: “M10”, “periodName”: “十月”, “值”: “5.2”, “脚注”:[{ “代码”: “R”,“文本“:”数据可能会在2016年4月15日进行修订。“}]},{”年份“:”2014“,”期间“:”M09“,”期间名称“:”九月“,”价值“:”5.2 “,”脚注“:[{”代码“:”R“,”文字“:”数据可能于2016年4月15日修订。“}]},{”年“:”2014“,”期间“: “M08”,“periodName”:“August”,“value”:“5.8”,“footnotes”:[{“code”:“R”,“text”:“数据于4月15日修订,

如何将数据拆分为具有包含Year,periodName和Value数据的单独列,而不包含所有JSON括号和引号?

我希望它在Excel中看起来像下面的每个数据在自己的单元格中:

Year periodName  Value

2014 January    254.3
2014 February   356.8
2014 March      456.5
2014 April      422.3
2014 May        415.8

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

添加了如何从劳工统计局(BLS)API获取数据的完全可复制的示例。他们的文档(link here)提供了有关如何使用python从API获取数据的示例。

在下面的代码中,我使用一个函数创建了一个数据框,该函数还添加了try和except子句,以在用户超出BLS API的每日点击次数时引发异常(未注册的用户每天最多可以请求25个查询) -per documentation FAQs)。最后,使用pandas.DataFrame.to_excel()创建一个excel文件。

我使用OP的BLS系列,并以年份为开始。

import pandas as pd
import json
import requests

def get_bls_data(series, start, end):
    headers = {'Content-Type': 'application/json'}
    data = json.dumps({"seriesid": series,"startyear":"%d" % (start), "endyear":"%d" % (end)})
    p = requests.post('https://api.bls.gov/publicAPI/v1/timeseries/data/', data=data, headers=headers)
    json_data = json.loads(p.text)
    try:
        df = pd.DataFrame()
        for series in json_data['Results']['series']:
            df_initial = pd.DataFrame(series)
            series_col = df_initial['seriesID'][0]
            for i in range(0, len(df_initial) - 1):
                df_row = pd.DataFrame(df_initial['data'][i])
                df_row['seriesID'] = series_col
                if 'code' not in str(df_row['footnotes']): 
                    df_row['footnotes'] = ''
                else:
                    df_row['footnotes'] = str(df_row['footnotes']).split("'code': '",1)[1][:1]
                df = df.append(df_row, ignore_index=True)
        return df
    except:
        json_data['status'] == 'REQUEST_NOT_PROCESSED'
        print('BLS API has given the following Response:', json_data['status'])
        print('Reason:', json_data['message'])


start = 2014
end = 2018
series = ['LAUDV061124400000003']

df = get_bls_data(series=series, start=start, end=end)
writer = pd.ExcelWriter('bls.xlsx', engine='xlsxwriter', options={'strings_to_numbers': True})
df.to_excel(writer, sheet_name='Sheet1', index=False)
writer.save()

bls.xlsx的预期输出:

Expected Output of bls.xlsx