鱼C论坛

 找回密码
 立即注册
查看: 3519|回复: 5

[已解决]关于使用tushare获取股票数据并将获取的list写入Excel的问题

[复制链接]
发表于 2020-11-21 19:05:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我的需求是这样的:
通过tushare获取指定股票的历史交易数据,返回一个pandas的数据类型,用list()方法转换为一个二维列表。再将这个列表用cell方法写入Excel列表。但是在运行到cell方法的时候老是提示KEY ERRER(标红的那个位置)。代码如下:
  1. import tushare as ts
  2. import openpyxl as opl

  3. def save(data,path):#将获取的二维列表存为Excel
  4.     wb = opl.Workbook()
  5.     ws = wb.active # 激活 worksheet
  6.     [h, l] = data.shape  # h为行数,l为列数
  7.     for i in range(h):
  8.         for j in range(l):
  9.             [color=Red]ws.cell(i, j, data[h, l])[/color]
  10.     wb.save(path)


  11. code = "300267"
  12. # pro = ts.pro_api()
  13. b = ts.get_k_data(code=code,start="1999-01-01",end='2020-01-01')
  14. list(b)
  15. save(b, '300267.xlsx')
复制代码
最佳答案
2020-11-21 20:34:03
本帖最后由 suchocolate 于 2020-11-21 20:38 编辑

range从0开始,那么第一个格子是cell(0,0),xls行列从1开始编号,所以报错。
  1.     for i in range(1,h+1):
  2.         for j in range(1,l+1):
复制代码

另外提一下,pandas支持直接导出为excel文件:df.to_excel('filename')
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 20:34:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2020-11-21 20:38 编辑

range从0开始,那么第一个格子是cell(0,0),xls行列从1开始编号,所以报错。
  1.     for i in range(1,h+1):
  2.         for j in range(1,l+1):
复制代码

另外提一下,pandas支持直接导出为excel文件:df.to_excel('filename')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 21:10:38 | 显示全部楼层
suchocolate 发表于 2020-11-21 20:34
range从0开始,那么第一个格子是cell(0,0),xls行列从1开始编号,所以报错。

另外提一下,pandas支持直 ...

我之前也是觉得可能是这方面的问题,我是在最后一个循环里给h和l+1但还是报错。这是怎么回事?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 21:14:58 | 显示全部楼层
suchocolate 发表于 2020-11-21 20:34
range从0开始,那么第一个格子是cell(0,0),xls行列从1开始编号,所以报错。

另外提一下,pandas支持直 ...

还是报keyerror错误哦~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 21:51:27 | 显示全部楼层
本帖最后由 suchocolate 于 2020-11-21 22:11 编辑
1b1n1m 发表于 2020-11-21 21:14
还是报keyerror错误哦~~

才注意到,pandas取数据这样取是不对的data[h, l],要精确定位某个元素得这样:
  1. print(df.iat[0, 0])
复制代码
不过这样就是慢,要一个一个写。所以建议用df.to_excel,或者用openpyxl的ws.append(一行数据)
  1. import tushare as ts
  2. import openpyxl as opl

  3. def save(data, path):#将获取的二维列表存为Excel
  4.     wb = opl.Workbook()
  5.     ws = wb.active # 激活 worksheet
  6.     h, l = data.shape  # h为行数,l为列数
  7.     for i in range(h):
  8.         ws.append(data.loc[i])
  9.     wb.save(path)


  10. code = "300267"
  11. # pro = ts.pro_api()
  12. b = ts.get_k_data(code=code,start="1999-01-01",end='2020-01-01')
  13. list(b)
  14. save(b, '300267.xlsx')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-22 09:04:50 | 显示全部楼层
suchocolate 发表于 2020-11-21 21:51
才注意到,pandas取数据这样取是不对的data[h, l],要精确定位某个元素得这样:不过这样就是慢,要一个一 ...

这个是按照你推荐的用to_excel方法写的:
  1. import tushare as ts
  2. import openpyxl as opl
  3. import pandas as pd

  4. code = "600565"
  5. b = ts.get_k_data(code=code,start="1999-01-01",end='2020-11-21')
  6. #下面是将获取的pandas数据帧转换为Excel。因为tushare获取的数据是pandas的数据帧格式,
  7. # 可以直接使用to_excel方法转换为xls格式的Excel文件
  8. whiter = pd.ExcelWriter("迪马股份.xls")#在这里需要有一个xlwt的库,如果没有还要下载。。。。
  9. print("whited!")
  10. b.to_excel(whiter)
  11. print("to_excel")
  12. whiter.save()
  13. print("saved~")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-30 00:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表