как считывать данные (с помощью панд?), чтобы они были правильно отформатированы?

#python #pandas #time-series

Вопрос:

У меня есть файл txt следующего формата:

 {"results":[{"statement_id":0,"series":[{"name":"datalogger","columns":["time","ActivePower0","CosPhi0","CurrentRms0","DcAnalog5","FiringAngle0","IrTemperature0","Lage 1_Angle1","Lage 1_Angle2","PotentioMeter0","Rotation0","SNR","TNR","Temperature0","Temperature3","Temperature_MAX31855_0","Temperature_MAX31855_3","Vibra0_X","Vibra0_Y","Vibra0_Z","VoltageAccu0","VoltageRms0"],"values":[["2017-10-06T08:50:25.347Z",null,null,null,null,null,null,null,null,null,null,"41762721","Testcustomer",null,null,null,null,-196,196,-196,null,null],["2017-10-06T08:50:25.348Z",null,null,null,null,null,null,346.2964,76.11179,null,null,"41762721","Testcustomer",null,null,null,null,null,null,null,null,null],["2017-10-06T08:50:25.349Z",null,null,2596,null,null,null,null,null,null,null,"41762721","Testkunde",null,null,null,null,null,null,null,null,80700],["2017-10-06T08:50:25.35Z",null,null,null,null,null,null,null,null,null,1956,"41762721","Testkunde",null,null,null,null,null,null,null,null,null],["2017-10-06T09:20:05.742Z",null,null,null,null,null,67.98999,null,null,null,null,"41762721","Testkunde",null,null,null,null,null,null,null,null,null]]}]}]}
...
 

Таким образом, в текстовом файле все сохраняется в одной строке. Файл CSV недоступен.
Я хотел бы иметь его в качестве фрейма данных в панд. когда я использую read.csv:

 df = pd.read_csv('time-series-data.txt', sep = ",")  
 

вывод print(df) выглядит примерно так [0 строк x 3455.. столбцов]
Так что в настоящее время все читается в одной строке. Тем не менее, я хотел бы иметь 22 столбца (time, activepower0, CosPhi0,..). Я прошу советов, большое вам спасибо.

Подходит ли для этого фрейм данных pandas вообще? размер текстовых файлов составляет до 2 ГБ.

Комментарии:

1. read_csv предназначен для файлов CSV, что здесь явно неприменимо. Вам, наверное, нужно read_json .

2. Пожалуйста, убедитесь { } [ ] , что результаты и значения правильно сбалансированы и являются правильным образцом.

3. Спасибо за подсказку с read_json! Я этого не знал..

4. Пример данных не является недопустимым python или json. Пожалуйста, обеспечьте допустимое подмножество, чтобы кто-то мог опробовать решение для реальных данных.

Ответ №1:

Вот пример, который может прочитать файл, который вы опубликовали.

Вот тестовый файл с именем test.json:

 {"results":[{"statement_id":0,"series":[{"name":"datalogger","columns":["time","ActivePower0","CosPhi0","CurrentRms0","DcAnalog5","FiringAngle0","IrTemperature0","Lage 1_Angle1","Lage 1_Angle2","PotentioMeter0","Rotation0","SNR","TNR","Temperature0","Temperature3","Temperature_MAX31855_0","Temperature_MAX31855_3","Vibra0_X","Vibra0_Y","Vibra0_Z","VoltageAccu0","VoltageRms0"],

"values":[
["2017-10-06T08:50:25.347Z",null,null,null,null,null,null,null,null,null,null,"41762721","Test-customer",null,null,null,null,-196,196,-196,null,null],
["2017-10-06T08:50:25.348Z",null,null,null,null,null,null,346.2964,76.11179,null,null,"41762721","Test-customer",null,null,null,null,null,null,null,null,null]]}]}]}
 

Вот код python, используемый для его чтения в:

 import json
import pandas as pd

# Read test file.
# This reads the entire file into memory at once. If this is not
# possible for you, you may want to look into something like ijson:
#    https://pypi.org/project/ijson/
with open("test.json", "rb") as f
    data = json.load(f)
# Get the first element of results list, and first element of series list
# You may need a loop here, if your real data has more than one of these.
subset = data['results'][0]['series'][0]
values = subset['values']
columns = subset['columns']
df = pd.DataFrame(values, columns=columns)
print(df)