我在目录中有许多.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
是否有完成工作的脚本?
答案 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进行测试