Извлечение определенных строк из CSV-файлов - PullRequest
0 голосов
/ 22 мая 2018

У меня есть файлы, содержащие необработанные сигналы.Файлы начинаются с того, что первый столбец - «время», а второй - «сигнал».

Имеется около 8 миллионов строк из-за того, что промежуток времени составляет около 20 часов со временем с шагом 10 мс.

Я хочу извлечь определенные куски данных из файлов в разное время «запуска» и «остановки».

Мне удалось что-то сделать.Это мой код:

import csv

#Constructs arrays of length 500 ms from raw signals
def constructor(filename, new_file, start, stop, label):
    with open(filename, 'rb') as fileRead:
        reader = csv.reader(fileRead, delimiter=',')
        for row in reader:
            if float(row[0]) == float(start):
                while float(row[0]) != float(stop):
                    array = []
                    for i in range(50):
                        array.append(row[1])
                        row = next(reader)
                    with open(new_file, 'ab') as fileWrite:
                        array.append(label)
                        writer = csv.writer(fileWrite)
                        writer.writerow(array)
            else:
                continue

constructor('SC4001E0-PSG_FPZ-CZ.csv', 'new.csv', 0, 1, 0)
constructor('SC4001E0-PSG_FPZ-CZ.csv', 'new.csv', 30630, 30750, 1)

Время начала и окончания указано в секундах.

0 в момент «0», 360 в момент «6 минут» и т. Д. И т. Д.

Я хочу просмотреть данные и сгруппировать их по эпохамполсекунды, отсюда и часть for i in range(50) И запишите этот список в другой файл CSV.

Мой код «технически» работает.Если я запускаю свою программу, чтобы начать с начала = 0 и остановки = 0,5, из моего файла данных:

0       5.01685
0.01    -2.578755
0.02    1.359707
0.03    -2.391209
0.04    -5.204396
0.05    -7.454945
0.06    -8.298901
0.07    -6.892308
0.08    -3.704029
0.09    -0.984615
0.1     2.203663
0.11    2.016117
0.12    1.641026
0.13    -2.672527
0.14    -0.79707
0.15    1.359707
0.16    2.860073
0.17    -2.203663
0.18    0.515751
0.19    5.860806
0.2     -1.734799
0.21    -3.047619
0.22    2.860073
0.23    7.830037
0.24    2.953846
0.25    -0.984615
0.26    -1.922344
0.27    -6.704762
0.28    -7.548718
0.29    -4.829304
0.3     -12.612454
0.31    -9.23663
0.32    -12.331136
0.33    -8.298901
0.34    -16.36337
0.35    -21.145788
0.36    -23.677656
0.37    -21.23956
0.38    -20.208059
0.39    -23.771429
0.4     -26.115751
0.41    -25.646886
0.42    -26.115751
0.43    -26.678388
0.44    -22.8337
0.45    -22.458608
0.46    -21.520879
0.47    -16.644689
0.48    -16.082051
0.49    -11.393407

я получаю это:

5.01685 -2.578755   1.359707    -2.391209   -5.204396   -7.454945   -8.298901   -6.892308   -3.704029   -0.984615   2.203663    2.016117    1.641026    -2.672527   -0.79707    1.359707    2.860073    -2.203663   0.515751    5.860806    -1.734799   -3.047619   2.860073    7.830037    2.953846    -0.984615   -1.922344   -6.704762   -7.548718   -4.829304   -12.612454  -9.23663    -12.331136  -8.298901   -16.36337   -21.145788  -23.677656  -21.23956   -20.208059  -23.771429  -26.115751  -25.646886  -26.115751  -26.678388  -22.8337    -22.458608  -21.520879  -16.644689  -16.082051  -11.393407  0

Что именно то, что я хочу, НОиногда время «начала» и «остановки» может сильно различаться.Если я запускаю строку кода constructor('SC4001E0-PSG_FPZ-CZ.csv', 'new.csv', 30630, 30750, 1) ... Ничего не происходит.Это похоже на то, как если бы Python-скрипт запускался из-за того, что время запуска было так далеко.

Причина, по которой я запускаю функции в каскадном порядке так, как у меня, заключается в том, что все разные порции данных, которые мне нужныпеременные времена.Все эти порции данных имеют соответствующую метку.

Данные в диапазоне от 240 до 350 с могут быть меткой 2. Данные в диапазоне от 56000 до 62130 могут быть меткой 1 и т. Д. Я хочу, чтобы все эти списки или эпохи,с соответствующей меткой в ​​новом файле csv.

Я понимаю, что с каждым запуском функции в такое большое время запуска это будет означать, что функция начинает выполнять избыточный процесс,необходимость заново открыть и перечитать файл данных с самого начала.

У кого-нибудь есть предложения?Кто-нибудь знает, почему сценарий останавливается при большом времени запуска?

Спасибо за ваше время.

РЕДАКТИРОВАТЬ: Я обнаружил свою ошибку.Это было 100% ошибка пользователя.Причина, по которой мой сценарий не извлекал строки при следующих значениях start, заключалась в том, что там не было НИКАКИХ данных для начала.Мои файлы настолько велики, что после того, как Excel достиг своего предела, Excel отрубил оставшиеся данные из файла.

Помимо очень небольшого количества дополнений и изменений в моем коде, он отлично работает.Так что, если кто-то хочет использовать его в качестве справки, вот оно.

1 Ответ

0 голосов
/ 23 мая 2018

Попробуйте следующий подход:

from itertools import dropwhile, takewhile
import csv

#Constructs arrays of length 500 ms from raw signals
def constructor(filename, new_file, start, stop, label):
    with open(filename, 'rb') as f_input, open(new_file, 'wb') as f_output:
        csv_input = csv.reader(f_input)
        csv_output = csv.writer(f_output)
        block = []

        for row in takewhile(lambda r: float(r[0]) < stop, dropwhile(lambda r: float(r[0]) < start, csv_input)):
            if len(block) == 50:
                csv_output.writerow(block + [label])
                block = []
            block.append(row[1])

        # This would write any remaining entries but label would not be in the same column
        csv_output.writerow(block + [label])   

constructor('input.csv', 'new1.csv', 0.0, 1.0, 0)
constructor('input.csv', 'new2.csv', 30630.0, 30750.0, 1)   

При этом используются itertools.dropwhile() и itertools.takewhile(), чтобы сначала отфильтровать интересующие строки.Затем он добавляет значения до достижения 50, а затем записывает блок в выходной файл.

Обратите внимание, что окончательное значение .writerow() выведет все оставшиеся значения.После добавления label он может находиться не в том же столбце.Я бы порекомендовал сделать ваш ярлык первым столбцом, например [label] + block

...