easy excel date 类型解析报错_pandas.read_excel()参数知多少?

问题:

利用pandas读入数据时,经常是通过pd.read_excel(r'path.xlsx')但有时,可能只需要表格中的某些列,当读入整张表格后,再通过索引选取需要的列,例如某个数据处理过程可能只需要['班级', '姓名', '语文']这三列数据。

79f04fc9395a5857203c121ca6caa129.png

按以前的习惯代码可能就写成如下:

import pandas as pd
df = pd.read_excel(r'成绩.xlsx')
new_df = df[['班级', '姓名', '语文']]

其实可以通过设置pd.read_excel()的参数直接实现,这样如果数据量很大时,还可以省下很多内存。(可通过sys模块中getsizeof(o)查看对象所占内存)

import pandas as pd
df = pd.read_excel(r'成绩.xlsx', usecols=range(3)) 

在处理数据时,了解其自身参数,并充分利用,可以带来一些好处,比如节省内存等等,那下面的介绍将从3个方面去介绍:

  • 如何设置参数选取特定列
  • 如何设置参数选取特定行
  • 关于数据转换的一些参数

1.usecols的取值可以是哪些类型?

usecols值可以为:(None, str , list, callable)

None:默认值,返回所有列

str:‘A:C' 或者 ’A,B,C' ,excel中所选取的列所对应的字母

df = pd.read_excel(r'成绩.xlsx', usecols='A:C'**)

list:可以为列数的集合或者列名的集合

df = pd.read_excel(r'成绩.xlsx', usecols=[0,1,2]**)

df = pd.read_excel(r'成绩.xlsx', usecols=['班级', '姓名', '语文']**)

callable:函数,返回列名符合某些条件的那些列,比如返回**列名**中包含语文和数学的那些列

df = pd.read_excel(r'成绩.xlsx', usecols=lambda x: x in ['班级', '姓名', '语文']) # 有点类似apply的意思

备注:0.24版本之前,int:表示选取前**int+1**列,0.24之后被舍弃了,可以用[0,1,2,..,int]或者range(0, int+1)

2. 了解完了选取某些列之外,那关于如何选取某些行的参数有3个:

nrows: int,表示选取前n行

df = pd.read_excel(r'成绩.xlsx', nrows=1)

skipfooter:int,表示从最后一行开始,不读取n行

df = pd.read_excel(r'成绩.xlsx', skipfooter=2) # 表示

skiprows: list-like,表示不读取某些行

df = pd.read_excel(r'成绩.xlsx', skiprows=range(1, 100, 2)) # 只读取偶数行

3.除了以上关于行或列的操作,还有一些数据转换的参数:

dtype: 转换某些列的数据类型

type_name: 设置所有的列为type_name,若出现不能转换的类型,会报错;

df = pd.read_excel(r'成绩.xlsx', dtype=int) # 会报错,因为不能将字符串转换成int

字典:{col _ name: type _ name,...}

df 

convert_float:是否将float类型的整型(20.00)转换成int类型(20),默认值为True

备注:若某列数字包含真正的浮点数比如(20.01),那么该列将不会被转换(参考下图)

df = pd.read_excel(r'成绩.xlsx', convert_float=True)
df = pd.read_excel(r'成绩.xlsx', convert_float=False)

d76f709cf53852526374dd3cbc55d9fb.png

parse_dates与date_parser:通过设置parse_dates参数,可以在数据读入的时候将字符串格式的数据转换成日期格式;而date_parser参数则是进行日期转换的引擎(或者叫函数)

parse_dates:

布尔值:值为True,解析index列

列表:列名或者列数--['col_name','col_name',..] or ['col_num1, col_num2,...] ,同时将多列字符串格式转换成日期格式

列表:列表的列表 ---[['col_name','col_name2']] or [['col_num','col_num2']],将列表中的多列,合并一个日期格式

字典:{'str': ['col_name','col_name2',..]} 为新合并的日期列指定一个新的列名'col_name'

date_parser:function,默认调用dateutil.parser.parser 进行解析日期,具体解析哪些列取决于parse_dates指定的参数。因为此值可以为函数,所以可以进行自定义。

例如:如下格式的日期,利用data_parser的默认值并不能进行成功转换,所以可以date_parser 结合 pd.to_datetime()进行定义函数可以进行转换

4985f99ed547c05101d259eff5556d04.png
df = pd.read_excel(r'日期.xlsx', parse_dates=['date'], date_parser=lambda x: pd.to_datetime(x, format='%Y%m')

converters: 当然了,上述日期转换也可以通过设置converters也可以实现:converters意思就是将某个函数应用到某列上。

df = pd.read_excel(r'日期.xlsx', sheet_name='Sheet1', converters={'date': lambda x: pd.to_datetime(x, format='%Y%m')})

至此,本篇文章涉及到了以下几个方面:

  1. 如何选取某些特定的列,其所用到的参数为:usecols
  2. 如何选取某些特定的行,其所用到的参数为: skipfooter, skiprows, nrows
  3. 数据格式的设定:dtype 与 convert_float
  4. 日期格式的转换: parse_dates 与 date_parser
  5. 某些特定列的各种转换:converters(包括日期,数据类型等)

关于pd.read_excel()其他的参数您可以参考:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html?highlight=read_excel#pandas.read_excel​pandas.pydata.org

如果您有任何问题,欢迎与我进行交流!

水平有限,若有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值