L:python的Pandas模块:读/写CSV文件,读/写HDF5文件,获取股票数据

读/写数据文件

读/写CSV文件

CSV文件是以逗号分隔的文本文件,常用作软件之间数据交换的中间文件。Pandas提供read_csv()和to_csv()两个方法读/写CSV文件。
假定有mobile.csv文件,内容如下:
,apple, huawei, oppo
一月,1100,1250,800
二月,1050,1300,850
三月,1200,1328,750

df=pd.read_csv("mobile.csv", encoding='cp936', index_col=0) # 读文件
文件mobile.csv中含有中文,当初保存时选了GBK(cp936)编码字符集,
所以读取时也应指定该编码集。如不指定,Pandas默认将按utf-8编码读取,
就会产生如下的'utf-8'解析错误。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd4 in position 2: invalid continuation byte

index_col=0 指定将文件的第0列作为索引标签。mobile.csv文件的第0行会被自动解析为列名。
数据文件m2.csv的内容如下。该文件只含数据,不含列名和标签,读取时可用names参数自行指定列名。
1100,1250,800
1050,1300,850
1200,1328,750
# 注:该文件不含中文,只有数字,所以可不指定encoding
df2 = pd.read_csv("m2.csv", names=['apple', 'huawei', 'oppo'])
# 也可以第一步:先读取;  
df3 = pd.read_csv("m2.csv", header=None)
# 第二步:再修改columns和index
df3.columns = ['apple', 'huawei', 'oppo']
df3.index = ['一月', '二月', '三月']

header=None表示文件不含列名。若不指定这个参数,则文件第0行“1100,1250,800”将被错误解析为列名。

有些文件不是用逗号分隔,而是用空格分隔。文件m4.txt内容如下:
1100 1250 800
1050 1300 850
1200 1328 750

df4 = pd.read_csv("m4.txt", sep="\s+", header=None)

m4.txt文件各个数据用数量不等的空格或制表键分隔,所以指定sep="\s+"参数。"\s+"是正则表达式,表示分隔符可为若干空白字符。

# 跳过前2行
pd.read_csv("score.txt", skiprows=2, sep='\s+', encoding='cp936' )        pd.read_csv("数据文件名", skiprows=[0, 2])    	# 跳过第0, 2行
pd.read_csv("数据文件名", skipfooter=2, engine = 'python') # 跳过尾部的2行
pd.read_csv("数据文件名", nrows=10)         	# 只读取前10行数据

文件中如包含日期数据,可以用parse_dates参数指定按日期解析。stock.txt内容如下:
交易日 开盘 最高 最低 收盘 成交量
2019/03/22 18.09 18.63 18.02 18.15 43760812
2019/03/23 18.16 18.35 18.06 18.13 27830796
2019/03/24 18.11 18.11 17.68 17.72 27448272

df = pd.read_csv('stock.txt', parse_dates=['交易日'], 	encoding='cp936', sep='\s+', index_col='交易日')
解析后的 df.index 是日期类,便于以后按日期段查询统计。
df.index    # 显示索引为日期类 dtype=datetime64[ns]

数据框对象具有 to_csv()方法,可将数据存入CSV文件。

df.to_csv("d1.csv", encoding='cp936')           	# 存盘,默认逗号分隔
df.to_csv("d2.txt", encoding='cp936', sep=' ') # 指定用空格分隔

Pandas提供了两个方法read_excel()和to_excel()读/写电子表格。
#默认读第1个工作表,第1行作为列名,A列(第0列)作为标签

df1 = pd.read_excel("mobile.xlsx", index_col=0)    # 读Excel文件

# sheet_name指定读工作簿中的某个工作表
df2 = pd.read_excel("mobile.xlsx", sheet_name='二季度')

将数据框保存到Excel文件中时,使用to_excel()方法。
df1.to_excel("a1.xlsx")               # 存入Excel文件

可以将多个数据框保存到一个 Excel文件的不同工作表中。
如下语句执行后,df1和df2的数据分别保存在test.xlsx内名为"一季度""二季度"的工作表中。
from  pandas  import  ExcelWriter
with  ExcelWriter("test.xlsx")  as  writer:
    df1.to_excel(writer, sheet_name='一季度')
    df2.to_excel(writer, sheet_name='二季度')

读/写HDF5文件

HDF(Hierarchical Data Format)是一种用于存储和组织大量数据的文件格式。

#若store.h5文件不存在,则先创建;若已存在,则打开此文件
store = pd.HDFStore('store.h5')   
store['dfa'] = df1 		# 将df1保存到文件中,键名dfa
store['dfb'] = df2 		# 将df2保存到文件中,键名dfb
store.close() 		# 关闭文件

读出已保存的数据可以使用下面的命令。
store = pd.HDFStore('store.h5')  	# 打开文件   
df3 = store['dfa']               	# 根据dfa键名取出数据
df4 = store['dfb']               	# 根据dfb键名取出数据

从上面示例可以看出,HDF文件存取数据的方式类似于字典操作,都通过键存取数据。

获取股票数据 (利用 雅虎财经 和 tushare )

命令行上先安装   conda  install   pandas-datareader
# 雅虎财经(慢/易出错)
import pandas_datareader.data as web
# 上市后缀.ss,  深市后缀.sz,  获取 'High', 'Low', 'Open', 'Close', 'Volume'
d1= web.get_data_yahoo('600030.ss', start = '2020-02-01', end = '2020-02-29')
d2= web.get_data_yahoo('002522.sz', start = '2020-02-01', end = '2020-02-29')
d3= web.get_data_yahoo('BA', start = '2020-02-01', end = '2020-03-29')
d4= web.get_data_yahoo(['MSFT','AAPL'], start = '2020-02-01', end = '2020-02-29')

命令行上先安装  pip  install  tushare
import tushare as ts    # 快速
hs300 = ts.get_k_data('hs300',start ='2020-01-01', end = '2020-02-29')
k2522 = ts.get_k_data('002522',start ='2020-01-01', end = '2020-02-29')

猜你喜欢

转载自blog.csdn.net/qq_43416157/article/details/106878987
今日推荐