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

1 篇文章 0 订阅
1 篇文章 0 订阅

最近接手一个任务,从一个有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'))

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

2.分块处理

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

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

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

for chunk in df:
	print(chunk)

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

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

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

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

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

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

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

然后我需要每行地去验证,看时间是否是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'   #在每行数据末尾加上换行符

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

filename.write(mylist)
filename.close()
  • 42
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值