import pandas as pd
import os
# 定义块大小
chunksize = 10000000 # 1MB
# 由于csv文件header在第一行,分块处理之后,只有第一块有有header,要想让其他块也有header,必须对每一块的header进行赋值
# 读取 CSV 文件并分块处理
for i,chunk in enumerate(pd.read_csv('D:/dt_electric_store/dt_electric_store.csv', chunksize=chunksize):
#获取header,并为之后的header进行赋值
if i == 0:
header = chunk.columns.tolist()
if i != 0:
chunk.columns = header
# 按照年和月进行分类
chunk['time_']
grouped = chunk.groupby([chunk['time_'].dt.year, chunk['time_'].dt.month])
# 遍历每个年月组合
for name, group in grouped:
# 构造文件名
year = name[0]
month = name[1]
filename = f'{year}-{month}.csv'
# 将同一年月份下的数据写入到同一个 CSV 文件中
if os.path.exists(filename):
group.to_csv(filename, mode='a', header=False, index=False)
else:
group.to_csv(filename, index=False)
由于数据量太大,pandas读取文件时,会把已读文件缓存到内存中,这样会导致内存直接爆掉,因而必须对数据进行分块处理,而使用dask或者spark也能处理大数据量,但是那只是在环境允许情况下。
本电脑内存仅为16G却能处理20G数据,首先定义块大小,之后迭代读取文件,之后按照所需进行分组,把每次分组后数据追加到相应的文件中。
本代码按照年份和月份进行进行分组,处理的数据中有一个字段为time_,需要把他格式化为dataFrame类型。
重要内容已在代码详细解释,这里不在赘述。