更快速地将一堆.csv文件转换为HDF数据帧

时间:2017-05-05 07:06:09

标签: python-2.7 multiprocessing netcdf hdf

1。背景

HDF是一种极好的数据存储和管理文件格式。

我有一个源数据(365 .csv个文件),其中包含所有监控站点的空气质量数据(时间分辨率1h )(超过1500 )中国。每个文件由许多特征(颗粒物,SO2等)及其相应的时间组成。

我已为感兴趣的人上传了一些模板文件here

  

我的目标==>将所有文件合并到一个数据框中以进行有效管理

2。我的代码

# -*- coding: utf-8 -*-  
#coding=utf-8
import pandas as pd
from pandas import HDFStore, DataFrame
from pandas import read_hdf

import os,sys,string
import numpy as np

### CREAT A EMPTY HDF5 FILE

hdf = HDFStore("site_2016_whole_year.h5")


### READ THE CSV FILES AND SAVE IT INTO HDF5 FORMAT
os.chdir("./site_2016/")
files = os.listdir("./")
files.sort()

### Read an template file to get the name of columns    
test_file= "china_sites_20160101.csv"
test_f = pd.read_csv(test_file,encoding='utf_8')
site_columns = list(test_f.columns[3:])
print site_columns[1]

feature =  ['pm25','pm10','O3','O3_8h','CO',"NO2",'SO2',"aqi"]
fe_dict = {"pm25":1,"aqi":0, 'pm10':3, 'SO2':5,'NO2':7, 'O3':9,"O3_8h":11, "CO": 13}
for k in range(0,len(feature),1):
    data_2016 = {"date":[],'hour':[],}
    for i in range(0,len(site_columns),1):
        data_2016[site_columns[i]] = []
    for file in files[0:]:
        filename,extname = os.path.splitext(file)
        if (extname == ".csv"):
            datafile =file
            f_day = pd.read_csv(datafile,encoding='utf_8')
            site_columns = list(f_day.columns[3:])
            for i in range(0,len(f_day),15):
                datetime = str(f_day["date"].iloc[i])
                hour = "%02d" % ((f_day["hour"].iloc[i]))
                data_2016["date"].append(datetime)
                data_2016["hour"].append(hour)
                for t in range(0,len(site_columns),1): 
                    data_2016[site_columns[t]].\
                  append(f_day[site_columns[t]].iloc[i+fe_dict[feature[k]]])]
  data_2016  = pd.DataFrame(data_2016)
  hdf.put(feature[k], data_2016, format='table', encoding="utf-8")

3。我的问题

使用上面的代码,可以创建hdf5文件,但速度很慢。

我的实验室有一个32核CPU的Linux集群。有没有方法可以将我的程序转换为多处理程序?

1 个答案:

答案 0 :(得分:1)

也许我不能正确理解你的问题,但我会用这样的东西:

import os
import pandas as pd

indir = <'folder with downloaded 12 csv files'>
indata = []
for i in os.listdir(indir):
    indata.append(pd.read_csv(indir + i))

out_table = pd.concat(indata)
hdf = pd.HDFStore("site_2016_whole_year.h5", complevel=9, complib='blosc')
hdf.put('table1',out_table)
hdf.close()

对于12个输入文件,我的笔记本电脑需要2.5秒,所以即使是365个文件也应该在一分钟左右完成。在这种情况下,我认为不需要并行化。