赞
踩
最近接手一个任务,从一个有40亿行数据的csv文件中抽取出满足条件的某些行的数据,40亿行。。。如果直接使用pandas的read_csv()方法去读取这个csv文件,那服务器的内存是会吃不消的,所以就非常有必要使用chunksize去分块处理。现在就开始讲chunksize的一些使用。
**
**
红框内是时间戳,需要使用pd.to_datetime()函数去将时间戳转换为时间格式,代码如下:
pd.to_datetime(chunk['time_stamp'],unit='s',origin=pd.Timestamp('2018-07-01'))
单位是秒(s),起始时间为2018-07-01,我们的目标就是抽出2018-07-01这天的数据。
想使用分块处理,只需在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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。