Я создаю инструмент, который поможет автоматизировать анализ данных из нескольких лабораторных установок на еженедельной основе. Текстовый файл с разделителями табуляции создается каждый день. Каждая строка представляет данные, взятые каждые 2 секунды, поэтому имеется 43200 строк и много столбцов (каждый файл равен 75 МБ)
Я загружаю семь текстовых файлов, используя pandas.readcsv, и извлекаю только три нужных мне столбца в кадр данных pandas. Это медленнее, чем хотелось бы, но приемлемо. Затем я отображаю данные в автономном режиме Plotly для просмотра интерактивного графика. Это запланированное задание, запускаемое раз в неделю.
Данные отображаются в зависимости от даты и времени. Часто тестовые настройки временно недоступны, и в данных будут пропуски. К сожалению, при построении графика все данные соединяются линиями, даже если тест был в автономном режиме в течение нескольких часов или дней.
Единственный способ предотвратить это - вставить строку с датой между двумя датами с фактическими данными и NaN для всех отсутствующих данных. Я реализовал это для отсутствующего файла данных достаточно легко, однако я хочу обобщить это для любых пробелов в данных, превышающих определенный период времени. Я нашел решение, которое, кажется, работает, но ДЕЙСТВИТЕЛЬНО медленно:
# alldata is a pandas dataframe with 302,000 rows and 4 columns
# one datetime column and three float32 columns
alldata_gaps = pandas.DataFrame() #new dataframe with gaps in it
#iterate over all rows. If the datetime difference between
#two consecutive rows is more than one minute, insert a gap row.
for i in range(0, len(alldata)):
alldata_gaps = alldata_gaps.append(alldata.iloc[i])
if alldata.iloc[i+1, 0]-alldata.iloc[i,0] > datetime.timedelta(minutes=1):
Series = pandas.Series({'datetime' : alldata.iloc[i,0]
+datetime.timedelta(seconds=3)})
alldata_gaps = alldata_gaps.append(Series)
print(Series)
У кого-нибудь есть предложения, как я мог бы ускорить эту операцию, чтобы она не заняла так много времени?
Вот дропбокс-ссылка на пример файла данных, содержащий всего 100 строк
Вот ссылка на мой текущий скрипт без добавления пробелов