当前位置:   article > 正文

pandas使用chunksize分块处理大型csv文件_pandas chunksize

pandas chunksize

最近接手一个任务,从一个有40亿行数据的csv文件中抽取出满足条件的某些行的数据,40亿行。。。如果直接使用pandas的read_csv()方法去读取这个csv文件,那服务器的内存是会吃不消的,所以就非常有必要使用chunksize去分块处理。现在就开始讲chunksize的一些使用。
**

1.本次任务的目标

**
在这里插入图片描述

红框内是时间戳,需要使用pd.to_datetime()函数去将时间戳转换为时间格式,代码如下:

pd.to_datetime(chunk['time_stamp'],unit='s',origin=pd.Timestamp('2018-07-01'))
  • 1

单位是秒(s),起始时间为2018-07-01,我们的目标就是抽出2018-07-01这天的数据。

2.分块处理

想使用分块处理,只需在read_csv()方法中加入chunksize=100000(这里假设每一块有100000行),代码如下:

df=pd.read_csv('data.csv',header=None,chunksize=100000)
  • 1

然后使用for循环去每块每块地去处理(chunk的type是DataFrame):

for chunk in df:
	print(chunk)
  • 1
  • 2

现在我需要把时间戳的那一列改个名,这样方便下面的计算(默认列名是2,要改成time_stamp),下面的代码都是在上面那个for循环里面的:

chunk.rename(columns={2:'time_stamp'},inplace=True)
  • 1

然后将每个chunk里面的时间戳变换成时间格式:

chunk['time_stamp']=pd.to_datetime(chunk['time_stamp'],unit='s',origin=pd.Timestamp('2018-07-01'))
  • 1

chunk[‘time_stamp’]的意思是:该chunk块里的名为time_stamp的列

先打开要存放的文件和定义一个字符串:

filename=open('data1.txt','a')
mylist=''
  • 1
  • 2

然后我需要每行地去验证,看时间是否是2018-07-01这天的。就又要用到for循环:

for i in range(len(chunk)):  #len(chunk)可得到chunk的行数
	k=chunk.iloc[i]['time_stamp']   #得到第i行的第time_stamp列的值,这里必须使用iloc,不能用loc,不然会报错
	if k < pd.datetime(2018,7,2):  #因为是从2018-07-01开始计算时间,所以要得到2018-07-01的数据,只需时间小于2018-07-02
		for m in chunk.columns.values:  #chunk.columns.values得到列名		
			if m=='time_stamp':  #这个if是为了将时间格式转换为时间戳,就是还原回之前csv文件的数据格式
				sjcha=chunk.iloc[i][m]-pd.datetime(2018,7,1)  #计算出两个日期之间的差
				sjchuo=sjcha.days*86400 + sjcha.seconds    #days和seconds都是属性
				mylist=mylist+str(sjchuo)   #将每行的数据都装进字符串
			else:	
				mylist=mylist+str(chunk.iloc[i][m])
			if m!=10:    #10是最后一列的默认列名,这个if是除了最后一个数据,其他数据之间都要加上逗号
				mylist=mylist+','
		mylist=mylist+'\n'   #在每行数据末尾加上换行符
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最后,只需将得到的字符串写进文件:

filename.write(mylist)
filename.close()
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/74962
推荐阅读
相关标签
  

闽ICP备14008679号