[英]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.