Я пытаюсь преобразовать следующий пример, вложенный json в два отдельных кадра данных. У меня более 100 ГБ файлов, поэтому мне нужно остаться с dask или другим распределенным фреймворком.
{
"unevenlySampledChannels": [
{
"channelTypes": [
"LATITUDE",
"LONGITUDE"
],
"timestampsMicrosecondsUtc": [
"1560989094058462",
"1560989095057674",
"1560989096074388"
],
"float64Payload": {
"payload": [
84,
34,
84.5,
34.6,
84.54,
34.6
]
}
},
{
"channelTypes": [
"gyroscope_x",
"gyroscope_y",
"gyroscope_z"
],
"timestampsMicrosecondsUtc": [
"1560989094058462",
"1560989095057674",
"1560989096074388"
],
"float64Payload": {
"payload": [
100,
200,
300,
101,
201,
301,
102,
202,
302
]
}
}
]
}
Пока я получил частично работающий следующий код:
def flatten(record):
return {
'TimeStamp': record["unevenlySampledChannels"][0]["timestampsMicrosecondsUtc"],
'Payload': record["unevenlySampledChannels"][0]["float64Payload"]["payload"],
}
df = db.from_sequence(filenames).map(open).map(json.load).map(flatten).to_dataframe().compute()
Код генерирует следующий фрейм данных:
Timestamp Payload
0 [1560989094058462,1560989095057674,1560989096074388] [84, 34, 84.5, 34.6, 84.54, 34.6]
1 [1560989097058462,1560989098057674,1560989099074388] [84, 34, 84.5, 34.6, 84.54, 34.6]
...
Я хочу, чтобы каждая уникальная метка времени была индексом. Длина списков варьируется в зависимости от файла и между датчиками (GPS и гироскоп, еще несколько записей не показаны), но длина «полезной нагрузки» всегда является целым числом, кратным временной отметке, в зависимости от количества элементов в записи channelTypes .
Timestamp lat long
1560989094058462 84 34
1560989095057674 84.5 34.6
1560989096074388 84.54 34.6
1560989097058462 84 34
1560989098057674 84.5 34.6
1560989099074388 84.54 34.6
...