我有包含原始信号的文件。文件从第一列开始,时间是'时间'第二个是'信号'。
由于时间跨度约为20小时,时间跨度为10毫秒,因此大约有800万行。
我想从各种“开始”文件中提取特定的数据块。并且'停止'次。
我设法得到了一些东西。这是我的代码:
B
'开始'并且'停止'时间以秒为单位。
0时间' 0' 360处于' 6分钟'标记,等等。
我想要运行数据并将数据分组为半秒的时间段,因此 SELECT A.[id],
Split.a.value('.', 'VARCHAR(100)') AS String
FROM (SELECT [id],
CAST ('<M>' + REPLACE(DataVal, ';', '</M><M>') + '</M>' AS XML) AS String
FROM testtabl) AS A CROSS APPLY String.nodes ('/M') AS Split(a);
部分,并将此列表写入另一个csv文件。
我的代码&#39;技术上&#39;作品。如果我从start = 0开始我的程序开始并且从我的数据文件中停止= 0.5:
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)
我明白了:
for i in range(50)
这正是我想要的但有时我的开始&#39;并且&#39;停止&#39;时间可以变化很大。如果我运行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
代码行......没有任何反应。好像Python脚本因为开始时间太远而得以上升。
我运行这些函数的原因是我拥有它的方式,因为我需要在不同的时间处理所有不同的数据块。所有这些数据块都有相应的标签。
范围240s到350s的数据可以是标签2。 范围56000s到62130s的数据可以是标签1等。我想要所有这些列表或时期,以及在新的csv文件上的相应标签。
我理解,每次运行该功能时,都会在“开始”中进行。时间这么大,意味着该函数开始做一些冗余的过程,不得不重新打开并重新读取数据文件。
有没有人有任何建议?有谁知道为什么脚本会停止在那里开始&#39;开始&#39;次?
感谢您的时间。
编辑:
我发现了我的错误。它碰巧是100%的用户错误。我的脚本没有提取更多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
值的行的原因是因为那里没有数据开始。我的文件太大了,Excel在Excel达到极限后切断了文件中剩余的数据。
除了对我的代码添加和更改很少外,它的效果很好。因此,如果有人想将它作为参考,那就是它。
答案 0 :(得分:0)
尝试以下方法:
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