#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)