首先,谢谢你的帮助。我非常擅长在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("c:\\temp\\" + seriesId + ".txt","w")
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
再次感谢您的帮助。
答案 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的预期输出: