У меня есть CSV-файлы, которые содержат 6 столбцов записанных данных (легко десятки тысяч строк), включая индекс в 3-м столбце (заголовок «o_idx»). Этот индекс обычно увеличивается на +1 в каждой строке, но есть исключения. Я хотел бы удалить или игнорировать все данные до, но не включая, второй экземпляр, где индекс меньше, чем в предыдущей строке. Я подумал об использовании счетчика, который увеличивается каждый раз, когда индекс падает в значении (порядка от 400 до 600 пунктов ниже), а затем начинает копировать данные в новый CSV-файл. Я также рассмотрел создание нового столбца, содержащего вычисляемое значение (предыдущее значение индекса, вычтенное из текущего индекса), которое должно быть 1, за исключением отмеченного, и использование второго отрицательного значения для начала. Как только я вначале преодолею ненужные данные, я построю пару столбцов вместе (график рассеяния xy, который у меня уже запущен). Пример данных из строк 8622-8625 в одном файле CSV, показанном ниже, обратите внимание, что индекс падает с 8213 до 7780, затем продолжает увеличиваться +1:
1530,10155,8212,15001,1570, -215
1530,102,8213,15000,1570, -212
1509,10155,7780,15000,1780, -211
1509,10077,7781,15001,1790, -210
Редактировать: добавить фрагмент кода - обратите внимание, что это не пытается запрошенную функцию - это то, что этот новичок ie надеется на руководство здесь.
import sys
import csv
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# file name and location
logdir = 'data/4-30-20'
logfile = logdir+'/'+'filename.CSV'
# metrics:
gaps = 0 # Number of gaps
skips = 0 # Number of skipped lines (total)
largestskip = 0 # Largest number of skipped lines
largestskiploc = 0 # Line number of largest skip
sessions = 0 # Number of detected sessions (blank row followed by header row)
rows = 0 # Lines processed
# series
pts = []
i_ld = []
i_acc = []
o_idx = []
o_ld = []
o_pos = []
o_vel = []
# Extra debugging output--be careful turning this on for
# very large datasets
DEBUG = False # Turns output on/off
skipthreshold = 10 # size of skip to show
# Display processed output after parsing file
def printResults():
avgskips = 0
if( gaps > 0 ):
avgskips = round((skips/gaps),2)
# File parsing code
with open( logfile, newline='') as csvfile:
# The first line of the file is blank, start
# with one session and skip to the header line
sessions += 1
csvfile.seek(0) # starting at beginning of file...
next(csvfile) # ...skip blank line
logreader = csv.DictReader(csvfile, delimiter=',')
prevIndex = 0
nextIndex = 0
for line in logreader:
# handle startup gap
if( rows == 0 ):
prevIndex = int(line['o_idx'])
rows += 1
pts.append(rows)
# detect whether a new session occurs by
# capturing a header row
if(line['o_idx'] == 'o_idx'):
sessions += 1
prevIndex = 0
nextIndex = 0
next(csvfile) # skip header row
else:
nextIndex = int(line['o_idx'])
diff = nextIndex - prevIndex - 1
i_ld.append(float(line['i_ld']))
i_acc.append(float(line['i_acc']))
o_idx.append(int(line['o_idx']))
o_ld.append(float(line['o_ld']))
o_pos.append(float(line['o_pos']))
o_vel.append(float(line['o_vel']))
# process gaps and skips
if((diff > 0) and (prevIndex != 5)):
gaps += 1
skips += diff
if(diff > largestskip):
largestskip = diff
largestskiploc = rows
# NOTE: be careful turning this on for very large datasets
if((DEBUG) and (diff > skipthreshold)):
print(str(prevIndex) + ' -> ' + line['o_idx'] + '; diff: ' + str(diff))
prevIndex = nextIndex
printResults()