Разделение и объединение данных в кучу csv-файлов в каталоге

#python #windows #csv #datetime #scripting

#python #Windows #csv #дата и время #скриптинг

Вопрос:

У меня много файлов .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 (вы можете найти дату во втором столбце). Файл должен начинаться со строки заголовка, которую вы найдете выше.

Примеры файлов можно найти здесь: Примеры файлов

Есть ли скрипт для выполнения этой работы?

Комментарии:

1. Да, есть один, но вы что-нибудь пробовали?

2. Я надеялся, что есть скрипт, который делает подобные вещи. Я просматривал, например, на github, но ничего не нашел. Поскольку я не очень разбираюсь в написании сценариев, я предположил, что существует сценарий, который я мог бы просто изменить…

3. Вы можете не найти его, потому что это не так сложно. Это всего лишь несколько строк кода, поэтому для этого не нужно создавать скрипт. Используйте pandas

4. Я думаю, это не так сложно, но я не знаю, с чего начать. Я просто знаю, что это экономит мне день работы… Мне просто нужна подсказка, с чего начать… использовать awk или что-то в этом роде ..?

5. Один вопрос, является ли значение даты в вашем файле .csv одинаковым в файле?

Ответ №1:

Следующий подход должен помочь вам начать:

 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

Комментарии:

1. Спасибо, Мартин. Я попробовал ваш скрипт, но он останавливается в строке 14: ValueError: time data DateTime does not match format

2. На данный момент я не могу запустить его. Я добавил ссылку на примеры файлов в свой вопрос, чтобы было понятнее.

3. Это было потому, что данные (как вы сказали) содержали дополнительные строки заголовка. Я добавил строку, чтобы пропустить эти дополнительные строки. Попробуйте обновленный скрипт.

4. Отлично! Это действительно сработало! Большое спасибо! Вы сэкономили мне часы скучной работы! Мне действительно нужно покопаться в python.