Как можно прочитать файл .dat, содержащий несколько таблиц, во фрейм данных Pandas? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть измерительное устройство, которое записывает данные в файлы .dat, например raw_data.dat, в эту папку , все с одинаковой структурой, и я хочу иметь возможность извлечь последнюю таблицу в файле вфрейм данных pandas.

В файле есть несколько таблиц, и я не уверен, что структура табуляции здесь стандартная для файлов .dat, но я попытался вставить текст в Excel, и он распознает текст как отдельныйТаблица, так что, вероятно, есть довольно стандартный способ правильно прочитать структуру в Python. Я не мог найти один, поэтому я попробовал действительно запутанный способ, читая файл .dat в строку и вручную отрубая верхнюю часть файла и сохраняя остальное как файл .dat. Я надеюсь, что затем каким-то образом смогу сохранить результат в формате .csv или .xls, но я все еще не могу найти, как это сделать. Кроме того, после импорта табуляция преобразуется в \ t, и это не возвращает к табуляции в сохраненных файлах. Мой код для этого ниже


mylines = []                             
with open ('raw_file.dat', 'rt') as myfile:
    for myline in myfile:
        mylines.append(myline)

string = (mylines[8:])

with open("updated.dat", "w") as output:
    output.write(str(string))

Я должен признать, что я довольно плохо знаком с Python и не уверен, что правильно использую функции. Тем не менее, я надеюсь, что есть более простой способ сделать это, чем обходной путь, который я пытаюсь.

1 Ответ

0 голосов
/ 03 октября 2019

Если вы можете быть уверены, что третья таблица, которую вы хотите, начинается с 8-й строки, то нет причин, по которым вам нужно усложнять ее, чем просто индексировать файл из 8-й строки. Оттуда вы можете использовать обработку строк и понимание списка для очистки ваших данных:

import pandas as pd

# Read the data.
with open('raw_data.dat', 'r') as fh:
    lines = fh.readlines()[8:]

# Remove newlines, tabs, and split each string separated by spaces.
clean = [line.strip.replace('\t', '').split() for line in lines]

# Feed the data into a DataFrame.
data = pd.DataFrame(clean[1:], columns=clean[0])

, который выводит:

               Time         Variab1e1  ...               v18               v19
0  +0.00000000e+000  +3.04142181e-002  ...  +0.00000000e+000  +0.00000000e+000
1  +1.00000000e+000  +1.96144191e-001  ...  +1.00000000e+000  +0.00000000e+000
2  +2.00000000e+000  +3.75599731e-001  ...  +2.00000000e+000  +0.00000000e+000

Если вы хотите преобразовать значения в числа с плавающей запятой, вы можете сделатьэто перед преобразованием данных в DataFrame:

headers = clean[0]
rows = [[float(value) for value in row] for row in clean[1:]]

data = pd.DataFrame(rows, columns=headers)

, что дает вам намного более чистый кадр:

   Time  Variab1e1  Variable2  Variable3  Variable4  ...  v15  v16   v17  v18  v19
0   0.0   0.030414        0.0   1.383808        0.0  ...  0.0  0.0  15.0  0.0  0.0
1   1.0   0.196144        1.0   7.660262        1.0  ...  0.0  1.0  15.0  1.0  0.0
2   2.0   0.375600        2.0  15.356726        2.0  ...  0.0  2.0  15.0  2.0  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...