簡體   English   中英

從csv文件中提取特定行

[英]Extracting specific rows from csv files

我有包含原始信號的文件。 文件的第一列為“時間”,第二列為“信號”。

由於時間跨度約為20小時,而時間以10 ms為增量,因此大約有800萬行。

我想在不同的“開始”和“停止”時間從文件中提取特定的數據塊。

我設法使事情順利進行。 這是我的代碼:

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文件。

我的代碼在技術上有效。 如果我從我的數據文件中啟動程序以從start = 0開始和stop = 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腳本由於開始時間太遠而放棄了。

之所以以各種方式運行這些函數,是因為我在不同的時間需要所有不同的數據塊。 所有這些數據塊都有其相應的標簽。

范圍為240s至350s的數據可以標記為2。范圍為56000s到62130s的數據可以標記為1,依此類推。我希望所有這些列表或紀元以及它們對應的標簽位於新的csv文件中。

我了解到,每次運行該函數時,在“開始”時間如此之長,這意味着該函數開始執行一些冗余過程,必須從頭開始重新打開並重新讀取數據文件。

有沒有人有什么建議? 有誰知道為什么腳本會在較大的“開始”時間停止?

感謝您的時間。

編輯:我發現了我的錯誤。 碰巧是100%用戶錯誤。 為什么我的腳本不提取行的進一步原因start值,是因為沒有數據沒有開始。 我的文件太大,以至於Excel達到其極限后,Excel便將文件中的剩余數據砍掉了。

除了對我的代碼進行很少的添加和更改外,它還可以很好地工作。 因此,如果有人想將其用作參考,就可以了。

請嘗試以下方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM