Python读写csv文件专题教程(3)

这是第276篇原创

完整导图

前两个部分:

Python读写csv文件专题教程(1)

Python读写csv文件专题教程(2)


2.5 时间相关

parse_dates

如果导入的某些列为时间类型,但是导入时没有为此参数赋值,导入后就不是时间类型,如下:

In [5]: df = pd.read_csv('test.csv',sep='\s+',header=0,na_values=['#'])         

In [6]: df                                                                      
Out[6]: 
   id  id.1  age label       date
0   1  'gz'   10   YES  1989-12-1
1   2  'lh'   12    NO        NaN

In [7]: df.dtypes                                                               
Out[7]: 
id        int64
id.1     object
age       int64
label    object
date     object
dtype: object

date列此时类型为object,想办法转化为时间型:

In [8]: df = pd.read_csv('test.csv',sep='\s+',header=0,na_values=['#'],parse_dat
   ...: es=['date'])                                                            

In [9]: df                                                                      
Out[9]: 
   id  id.1  age label       date
0   1  'gz'   10   YES 1989-12-01
1   2  'lh'   12    NO        NaT

In [11]: df.dtypes                                                              
Out[11]: 
id                int64
id.1             object
age               int64
label            object
date     datetime64[ns]

此时的类型为datetime.

date_parser

date_parser参数定制某种时间类型,详细使用过程总结如下。我们的数据文件:

In [82]: cat test.csv                                                           
id  id  age  label  date
1  'gz'  10  YES  26-MAY-2019
2  'lh'  12  NO  30-MAR-2019

如果时间格式转化成标准的年月日,操作如下:

In [83]: df = pd.read_csv('test.csv',sep='\s+',parse_dates=['date'],date_parser=
    ...: lambda dates: pd.datetime.strptime(dates,'%d-%b-%Y'))                  

In [84]: df                                                                     
Out[84]: 
   id  id.1  age label       date
0   1  'gz'   10   YES 2019-05-26
1   2  'lh'   12    NO 2019-03-30

转化为timetuple格式,如下:

In [85]: df = pd.read_csv('test.csv',sep='\s+',parse_dates=['date'],date_parser=
    ...: lambda dates: pd.datetime.strptime(dates,'%d-%b-%Y').timetuple())      

In [86]: df                                                                     
Out[86]: 
   id  id.1  age label                                date
0   1  'gz'   10   YES  (2019, 5, 26, 0, 0, 0, 6, 146, -1)
1   2  'lh'   12    NO   (2019, 3, 30, 0, 0, 0, 5, 89, -1)

infer_datetime_format

infer_datetime_format 参数默认为 boolean, default False 如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。

2.6 分块读入

逐快读入内存

iterator

取值 boolean, default False 返回一个TextFileReader 对象,以便逐块处理文件。

这个在文件很大时,内存无法容纳所有数据文件,此时分批读入,依次处理。具体操作演示如下,我们的文件数据域一共有2行。

先读入一行,get_chunk参数1表示一次读入一行

In [105]: chunk = pd.read_csv('test.csv',sep='\s+',iterator=True)               

In [106]: chunk.get_chunk(1)                                                    
Out[106]: 
   id  id.1  age label         date       date1
0   1  'gz'   10   YES  26-MAY-2019  4-OCT-2017

再读入下一行,

In [107]: chunk.get_chunk(1)                                                    
Out[107]: 
   id  id.1  age label         date       date1
1   2  'lh'   12    NO  30-MAR-2019  2-SEP-2018

此时已到文件末尾,再次读入会报异常,

In [108]: chunk.get_chunk(1)  

StopIteration                             Traceback (most recent call last)
<ipython-input-108-f294b07af62c> in <module>
----> 1 chunk.get_chunk(1)

chunksize

chunksize: int, default None 设置文件块的大小

2.7 引用,压缩,文件格式

compression

参数取值为 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’ 直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。

如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。

In [119]: df = pd.read_csv('test.zip',sep='\s+',compression='zip')              

In [120]: df                                                                    
Out[120]: 
   id  id.1  age label         date       date1
0   1  'gz'   10   YES  26-MAY-2019  4-OCT-2017
1   2  'lh'   12    NO  30-MAR-2019  2-SEP-2018

thousands

thousands : str, default None 千分位分割符,如“,”或者“."

如下,显示数据文件 test.csv

In [122]: cat test.csv                                                          
id  id  age  label  date
1  'gz'  10  YES  1,090,001
2  'lh'  12  NO  20,010

其中date列为带千分位分隔符的整形,如果我们不显示指定thousands参数,则读入后的date列类型为object. 如下:

In [125]: df = pd.read_csv('test.csv',sep='\s+')                                

In [126]: df                                                                    
Out[126]: 
   id  id.1  age label       date
0   1  'gz'   10   YES  1,090,001
1   2  'lh'   12    NO     20,010

In [127]: df.dtypes                                                             
Out[127]: 
id        int64
id.1     object
age       int64
label    object
date     object
dtype: object

如果显示指定thousands为,,则读入后date列显示为正常的整型。

In [128]: df = pd.read_csv('test.csv',sep='\s+',thousands=',') 

In [132]: df                                                                    
Out[132]: 
   id  id.1  age label     date
0   1  'gz'   10   YES  1090001
1   2  'lh'   12    NO    20010


In [130]: df['date'].dtypes                                                     
Out[130]: dtype('int64')

decimal

decimal : str, default ‘.’ 字符中的小数点 (例如:欧洲数据使用’,‘). 类别上面的thousands参数。

float_precision

float_precision : string, default None 指定c引擎的浮点数转化器,默认为普通,参数可能取值还包括:high-precision, round_trip.

lineterminator

lineterminator: str (length 1), default None 行分割符,只在C解析器下使用。

quotechar

quotechar: str (length 1), optional 引号,用作标识开始和解释的字符,引号内的分割符将被忽略。

quoting

quoting : int or csv.QUOTE_* instance, default 0

控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)

doublequote : boolean, default True 双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。

escapechar

escapechar: str (length 1), default None 当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。

comment

comment: str, default None 标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。

这个参数只能是一个字符,空行(就像skip_blank_lines=True),注释行被header和skiprows忽略一样。例如,如果指定comment='#' 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c'作为header。

encoding

encoding: str, default None 指定字符集类型,通常指定为'utf-8'. List of Python standard encodings

dialect

dialect: str or csv.Dialect instance, default None 如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档

error_bad_lines

error_bad_lines : boolean, default True 如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将该行剔除(只能在C解析器下使用)

我们故意修改test.csv文件某个单元格的取值(带有两个空格,因为我们的数据文件默认分隔符为两个空格)

In [148]: cat test.csv                                                          
id  id  age  label  date
1  'gz'  10.8  YES  1,090,001
2  'lh'  12.31  NO  O  20,010

此时,读入数据文件,会报异常:

ParserError: Error tokenizing data. C error: Expected 5 fields in line 3, saw 6

在小样本读取时,这个错误很快就能发现,但是在读取大数据文件时,假如读了1个小时,最后几行出现了这类错误,就很闹心!所以稳妥起见,我们一般都会将error_bad_lines设置为False, 也就是剔除此行, 同时使用下节的 warn_bad_lines 设置为True,打印剔除的这行。

In [150]: df = pd.read_csv('test.csv',sep='\s+',error_bad_lines=False)          
b'Skipping line 3: expected 5 fields, saw 6\n'

In [151]: df                                                                    
Out[151]: 
   id  id.1   age label       date
0   1  'gz'  10.8   YES  1,090,001

可以看到输出的警告信息:Skipping line 3: expected 5 fields, saw 6

warn_bad_lines

warn_bad_lines : boolean, default True 如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。

参数 tupleize_cols,不推荐使用。

以上就是读csv文件的所有参数及对应演示。

本文分享自微信公众号 - Python与机器学习算法频道(alg-channel)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

商汤开源最大目标跟踪库PySOT,代码已正式上线!

前几天 CVer推送一篇:重磅!商汤开源最大目标跟踪库PySOT:含SiamRPN++和SiamMask等算法,介绍了来自商汤科技的STVIR(SenseTim...

11840
来自专栏月色的自留地

TensorFlow从1到2(十五)(完结)在浏览器做机器学习

TensorFlow一直努力扩展自己的基础平台环境,除了熟悉的Python,当前的TensorFlow还实现了支持Javascript/C++/Java/Go/...

15220
来自专栏深度学习计算机视觉

无人机图片物体检测baseline

The object category indicates the type of annotated object, (i.e., ignored regio...

17710
来自专栏算法channel

Python函数式编程 入门必备

python 支持函数式编程,提到数式编程,大家首先想到的是多个函数内嵌。的确是这样。不过,要想入门函数式编程,里面涉及到的闭包,是不得不掌握的,换句话说,如果...

12730
来自专栏CDA数据分析师

爬取视频数据后我们发现,原来逛B站也能学编程...

很多人提到B站,首先想到的就会是二次元或者鬼畜,上个月,我们公众号也发表了一篇关于B站鬼畜视频的文章:大数据解读B站火过蔡徐坤的“鬼畜“区巨头们。

15920
来自专栏机器学习与统计学

100天搞定机器学习|Day21 Beautiful Soup

网络爬虫,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。通俗来说就是模拟用户在浏览器上的操作,从特定网站,自动提取对自己有价值的信息。主要通过查找域...

10920
来自专栏Python绿色通道

如何实时可视化渲染你的数据?

在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示。

25250
来自专栏程序员的知识天地

人生苦短:运行你的第一个 Python 脚本

Shell 是一个Read-Eval-Print-Loop(REPL),它只接受命令,评估它们并打印输出。

13530
来自专栏机器学习与统计学

用Python对你的微信好友进行一波骚操作

临近毕业,慢慢的也感伤起来,回想大学这几年,除了技术的成长,最值得庆幸的就是结交了一帮志同道合的好友。后期自己做了公众号,微信好友的数量也越来越多,身边人所扮演...

22540
来自专栏ATYUN订阅号

数据科学家常犯的十大编程错误

数据科学家是“比任何软件工程师都更擅长统计,比任何软件工程师都更擅长软件工程的的统计学家”。许多数据科学家都有统计学背景却缺乏在软件工程方面的经验。我是资深的数...

9820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励