在目录中的一堆csv文件中拆分和合并数据

时间:2016-10-11 12:20:10

标签: python windows csv scripting

我在目录中有许多.csv文件,来自能量测量设备,每两秒钟存储一次文件。 每个文件看起来都类似于:

Position,Date,Time,V12,Unit,V23,Unit,V31,Unit,A1,Unit,A2,Unit,A3,Unit,P(SUM),Unit,S(SUM),Unit,Q(SUM),Unit,PF(SUM),Unit,PFH,Unit,WH,Unit,SH,Unit,QH,Unit,FREQ,Unit
0,7/21/2016,23:59:56,392.5, ACV,394, ACV,393.2, ACV,1.053, ACA,1.045, ACA,0, ACA,0.367,KW  ,0.432,KVA ,0.229,KVAR,0.84,,0.85,,854.6,KWH   ,1,MVAH  ,516.8,KVARH ,50,Hz  
0,7/21/2016,23:59:58,392.6, ACV,394.1, ACV,392.9, ACV,1.053, ACA,1.048, ACA,0, ACA,0.368,KW  ,0.433,KVA ,0.229,KVAR,0.84,,0.85,,854.6,KWH   ,1,MVAH  ,516.8,KVARH ,50,Hz  
0,7/22/2016,0:00:00,392.5, ACV,394, ACV,392.5, ACV,1.049, ACA,1.042, ACA,0, ACA,0.366,KW  ,0.431,KVA ,0.228,KVAR,0.84,,0.85,,854.6,KWH   ,1,MVAH  ,516.8,KVARH ,49.9,Hz  
0,7/22/2016,0:00:02,392.1, ACV,393.5, ACV,392.1, ACV,1.047, ACA,1.039, ACA,0, ACA,0.363,KW  ,0.428,KVA ,0.226,KVAR,0.84,,0.85,,854.6,KWH   ,1,MVAH  ,516.8,KVARH ,50,Hz  

有时文件中只有一天,有时两天或更多天(如果测量停止)。有时在数据之间存在标题(当测量停止并再次开始时)。 每个文件由30000行组成,数据按升序排序。

我想为通过日期命名的每一天制作一个文件。在此示例中,它将是2016-07-21.csv(您可以在第二列中找到日期)。该文件应以您在上面找到的标题行开头。

示例文件可以在这里找到: Sample files

是否有完成工作的脚本?

1 个答案:

答案 0 :(得分:2)

以下方法可以帮助您入门:

from datetime import datetime
from collections import defaultdict
import csv
import glob

days = defaultdict(list)

for filename in glob.glob('*.csv'):
    with open(filename, 'rb') as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)

        for row in csv_input:
            if row[0] != "Position":
                day = datetime.strptime('{} {}'.format(row[1], row[2]), '%m/%d/%Y %H:%M:%S')
                days[row[1]].append([day, row])

for day in sorted(days.keys()):
    with open('/myoutputfolder/{}.csv'.format(days[day][0][0].strftime('%Y-%m-%d')), 'wb') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(header)
        csv_output.writerows(row for dt, row in sorted(days[day], key=lambda x: x[0]))

这将读取所有csv文件,对条目进行排序,并将每天写入单独的csv文件。它使用Python defaultdict来保存每天的条目列表。它还将日期和时间列转换为Python datetime,以便在写入输出文件之前可以正确排序这些条目。 glob库用于返回给定文件夹的.csv个文件列表。如果需要子文件夹,则需要将其转换为使用os.walk()csv库用于自动将csv文件读入列表。

使用Python 2.7.12进行测试