在读文件,平安银行的利润表.xlsx为例,symbol 是股票代码,源数据为:
直接用read_excel读取的数据为:
股票简称 object
股票代码 int64
字段 object
2021-03-31 object
2020-12-31 object
2020-09-30 object
2020-06-30 object
2020-03-31 object
dtype: object
股票简称 股票代码 字段 ... 2020-09-30 2020-06-30 2020-03-31
0 平安银行 1 一、营业收入 ... 12719000.00 8468000.00 4178800.00
1 平安银行 1 利息净收入 ... 8956100.00 5936100.00 2976600.00
2 平安银行 1 其中:利息收入 ... 15868700.00 10483200.00 5207400.00
3 平安银行 1 减:利息支出 ... 6912600.00 4547100.00 2230800.00
4 平安银行 1 手续费及佣金净收入 ... 2543900.00 1739800.00 848100.00
5 平安银行 1 其中:手续费及佣金收入 ... 3078900.00 2068800.00 1073300.00
6 平安银行 1 减:手续费及佣金支出 ... 535000.00 329000.00 225200.00
7 平安银行 1 汇兑收益 ... 99300.00 50500.00 50300.00
8 平安银行 1 投资净收益 ... 936700.00 596300.00 275700.00
9 平安银行 1 其中:对联营公司的投资收益 ... -- -- --
10 平安银行 1 公允价值变动净收益 ... 150200.00 121500.00 17600.00
11 平安银行 1 其他业务收入 ... 10800.00 7600.00 2400.00
12 平安银行 1 二、营业支出 ... 3659900.00 2398000.00 1216200.00
13 平安银行 1 营业税金及附加 ... 122900.00 82000.00 41200.00
14 平安银行 1 业务及管理费用 ... 3537000.00 2316000.00 1175000.00
股票代码,应该为000001, 在读的时候,pandas转成了int64,目前只找到下面两种解决方案。
解决方案一:全部转成字符串
对读取的文件,不管是什么类型的数据,全部转成object
import pandas as pd
filepath = "lr_000001.xlsx" # 文件路径,字符串
sheet_name = 0 # sheet名, 整数
header = 0 # 行索引, 整数
index_col = 0 # 列索引,整数
frame = pd.read_excel(filepath, sheet_name=sheet_name, header=header, index_col=index_col,dtype=object)
print(frame.dtypes)
print(frame.columns)
print(frame)
输出结果为:
股票代码 object
字段 object
2021-03-31 object
2020-12-31 object
2020-09-30 object
2020-06-30 object
2020-03-31 object
dtype: object
Index(['股票代码', '字段', '2021-03-31', '2020-12-31', '2020-09-30', '2020-06-30',
'2020-03-31'],
dtype='object')
股票代码 字段 ... 2020-06-30 2020-03-31
股票简称 ...
平安银行 000001 一、营业收入 ... 8468000.00 4178800.00
平安银行 000001 利息净收入 ... 5936100.00 2976600.00
平安银行 000001 其中:利息收入 ... 10483200.00 5207400.00
平安银行 000001 减:利息支出 ... 4547100.00 2230800.00
平安银行 000001 手续费及佣金净收入 ... 1739800.00 848100.00
平安银行 000001 其中:手续费及佣金收入 ... 2068800.00 1073300.00
平安银行 000001 减:手续费及佣金支出 ... 329000.00 225200.00
平安银行 000001 汇兑收益 ... 50500.00 50300.00
平安银行 000001 投资净收益 ... 596300.00 275700.00
平安银行 000001 其中:对联营公司的投资收益 ... -- --
这样的数据,如果要做数据分析,就必选先转数据类型,特别是datatime类型的数据
解决方案二:填充,但是这种填充,也会有问题,不确定要填充的位数,有些股票代码只有5位
pandas中使用的是apply填充 : 0>6d的意思是补成六位,用0补,>是向左补,
# pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,
# 功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数。
# 最后使用匿名函数格式化数据,就得到想要的结果
frame['股票代码'] = frame['股票代码'].apply(lambda x:'{:0>6d}'.format(x))
print(frame)
股票代码 字段 ... 2020-06-30 2020-03-31
股票简称 ...
平安银行 000001 一、营业收入 ... 8468000.00 4178800.00
平安银行 000001 利息净收入 ... 5936100.00 2976600.00
平安银行 000001 其中:利息收入 ... 10483200.00 5207400.00
平安银行 000001 减:利息支出 ... 4547100.00 2230800.00
平安银行 000001 手续费及佣金净收入 ... 1739800.00 848100.00
平安银行 000001 其中:手续费及佣金收入 ... 2068800.00 1073300.00
还有一种是填充字符串的,使用 zfill()方法 :zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。在输出一些编号类型的数字时,往往需要前面补0,比如这样的数字:
serial_num = 15
serial_num = str(serial_num).zfill(6)
print(serial_num )
输出结果:000015