Python:来自 JSON 数据的 3D 网格

问题描述 投票:0回答:1

我已经在 Python 相关问题(或挑战)上挣扎了一段时间。现在我相信我应该从你们那里得到一些帮助或提示。

附加文件中,您将找到一个包含我正在使用的数据的 JSON 文件对象。我使用以下代码行加载数据:

with open('json_data.json','r') as openfile:
    json_object = json.load(openfile)

现在,当查看

json_object
时,您会注意到很多相关信息,例如 2D 维度中的单元格数量、
Numx
Numy
。现在,我感兴趣的键/参数是
data
键,即
json_object['data']
。该参数是一个列表项,通过
Numx
字典实例保存
Numy
,并保存每个实例的 X 和 Y 坐标。每个实例还保存第三个维度,即键
Data
中的时间维度,它是一个列表项,保存 n 个时间步长的值。这可能是显而易见的,但我觉得我应该提到每个坐标实例的时间戳是相同的。

因此,总而言之,对于每个坐标,都有一个带有值的时间序列,我想使用

numpy
将其转换为 3D 维度网格。我该怎么做?

我尝试使用以下方法将

data
键转换为 Pandas DataFrame:

df = pd.json_normalize(json_object["data"], record_path =["Data"],meta=["X","Y"])

这给了我一个 DataFrame,其值对应于给定的时间步长和坐标。 但我不知道如何继续 - 我如何将其变成 3D 网格?

然后我尝试循环每个时间戳,所以我将有 n 个 2D 网格的时间步长。但后来我很难如何实现时间以使其成为 3 维的。

timeStamps = [t['Time'] for t in data_json['data'][0]['Data']]
dfTimestamps = {}
for i,ts in enumerate(timeStamps):
   dfTimestamps[ts] = {}
   X = []
   Y = []
   vals = []
   for d in data_json['data']:
      X.append(d['X'])
      Y.append(d['Y'])
      vals.append(d['Data'][i]['Value'])
      dfTimestamps[ts]['X'] = X
      dfTimestamps[ts]['Y'] = Y
      dfTimestamps[ts]['Value'] = vals

编辑: 我将尝试从下面的 JSON 文件对象写入一些示例数据。

{'info': {'Parameters': None,
  'Unit': 'mm/hour',
  'Location': 'Input geojson',
  'Point': {'IdPoints': 0,
   'Name': None,
   'Description': None,
   'X': 571125,
   'Y': 6225625,
   'EPSG': None,
   'Latitude': 0,
   'Longitude': 0,
   'CreatedDatetime': '0001-01-01T00:00:00',
   'OrganizationId': None,
   'ResponsibleUserId': None,
   'Id': 0},
  'PointId': None,
  'ParameterId': 'Rainintensity, id: 204',
  'Timezone': 'UTC',
  'DataSource': 'X-band Sabro, RadarId: {303}',
  'EPSG': '32632',
  'CreatedDateTime': '2023-07-13T13:55:18.9099301Z',
  'AllPoints': False,
  'dxdy': 250,
  'Numx': 7,
  'Numy': 6,
  'X0': 0,
  'Y0': 0,
  'MissingSteps': 0,
  'ProcessQuality': [{'qualityIndex': 0,
   'qualityDescription': 'No problem detected',
   'qualitySteps': 3241,
   'missingSteps': None,
   'fromUTC': '2023-07-10T00:00:00',
   'toUTC': '2023-07-12T06:00:00'}]},
  'data': [{'X': 572125,
   'Y': 6226875,
   'Data': [{'Time': '2023-07-10T00:00:00', 'Value': 0},
     {'Time': '2023-07-10T00:01:00', 'Value': 0},
     {'Time': '2023-07-10T00:02:00', 'Value': 0},
     {'Time': '2023-07-10T00:03:00', 'Value': 0},
     {'Time': '2023-07-10T00:04:00', 'Value': 0},
     {'Time': '2023-07-10T00:05:00', 'Value': 0},
     {'Time': '2023-07-10T00:06:00', 'Value': 0},
     {'Time': '2023-07-10T00:07:00', 'Value': 0},
     {'Time': '2023-07-10T00:08:00', 'Value': 0.399},
     {'Time': '2023-07-10T00:09:00', 'Value': 0},
     {'Time': '2023-07-10T00:10:00', 'Value': 0},
     {'Time': '2023-07-10T00:11:00', 'Value': 0},
     ...
     {'Time': '2023-07-10T16:37:00', 'Value': 0.299},
     {'Time': '2023-07-10T16:38:00', 'Value': 0},
     {'Time': '2023-07-10T16:39:00', 'Value': 0},
     ...]},
   {'X': 572125,
   'Y': 6226875,
   'Data': [{'Time': '2023-07-10T00:00:00', 'Value': 0},
     {'Time': '2023-07-10T00:01:00', 'Value': 0},
     {'Time': '2023-07-10T00:02:00', 'Value': 0},
     {'Time': '2023-07-10T00:03:00', 'Value': 0},
     {'Time': '2023-07-10T00:04:00', 'Value': 0},
     {'Time': '2023-07-10T00:05:00', 'Value': 0},
     {'Time': '2023-07-10T00:06:00', 'Value': 0},
     {'Time': '2023-07-10T00:07:00', 'Value': 0},
     {'Time': '2023-07-10T00:08:00', 'Value': 0.399},
     {'Time': '2023-07-10T00:09:00', 'Value': 0},
     {'Time': '2023-07-10T00:10:00', 'Value': 0},
     ...
     {'Time': '2023-07-10T16:37:00', 'Value': 0.299},
     {'Time': '2023-07-10T16:38:00', 'Value': 0},
     {'Time': '2023-07-10T16:39:00', 'Value': 0},
     ...]},
   {'X': 571125,
   'Y': 6226125,
   'Data': [{'Time': '2023-07-10T00:00:00', 'Value': 0},
     {'Time': '2023-07-10T00:01:00', 'Value': 0},
     {'Time': '2023-07-10T00:02:00', 'Value': 0.259},
     {'Time': '2023-07-10T00:03:00', 'Value': 0},
     {'Time': '2023-07-10T00:04:00', 'Value': 0},
     {'Time': '2023-07-10T00:05:00', 'Value': 0.321},
     {'Time': '2023-07-10T00:06:00', 'Value': 0.279},
     {'Time': '2023-07-10T00:07:00', 'Value': 0},
     {'Time': '2023-07-10T00:08:00', 'Value': 0.371},
     {'Time': '2023-07-10T00:09:00', 'Value': 0.399},
     {'Time': '2023-07-10T00:10:00', 'Value': 0.345},
     ...

因此,我的文件开头有

info
键,其中包含相关信息。
data
键保存着我想要转换为 3D 网格的信息。对于每个坐标,都有时间序列实例,如上所示,其中我包含了 3 个坐标实例的示例。

python json numpy multidimensional-array
1个回答
0
投票

你的尝试

df = pd.json_normalize(json_object["data"], record_path =["Data"],meta=["X","Y"])

基本正确。然后你问:

如何将其变成 3D 网格?

也许你指的是一个二维值数组,但这会因为许多因素而变得复杂,包括你有很多重复项,并且数据中有不规则的网格覆盖:

import json
import pandas as pd

with open('json_data.json') as file:
    data = json.load(file)['data']

df = pd.json_normalize(data=data, record_path='Data', meta=['X', 'Y'])
df['Time'] = pd.to_datetime(df.Time)

df = (
    df.set_index(['Y', 'X'])
    .Value.groupby(level=['Y', 'X'])
    .mean()
    .unstack(level='X')
)

如果您实际上想要三个索引(X/Y/Time),同样的问题仍然存在:

import json
import pandas as pd

with open('json_data.json') as file:
    data = json.load(file)['data']

df = pd.json_normalize(data=data, record_path='Data', meta=['X', 'Y'])
df['Time'] = pd.to_datetime(df.Time)

df = (
    df.set_index(['Y', 'X', 'Time'])
    .Value.groupby(level=['Y', 'X', 'Time'])
    .mean()
    .unstack(level='X')
)

根据您的评论,您真正想要的是

  • NaN 用零填充的框架;
  • Time 的外部索引,然后是 Y;
  • X 的内部(列)索引;和
  • 重复项被
    first()
    消除。

这意味着

import json
import pandas as pd

with open('json_data.json') as file:
    data = json.load(file)['data']

df = pd.json_normalize(data=data, record_path='Data', meta=['X', 'Y'])
df['Time'] = pd.to_datetime(df.Time)

Z = (
    df.set_index(['Time', 'Y', 'X'])
    .Value.groupby(level=['Time', 'Y', 'X'])
    .first()
    .unstack(level='X', fill_value=0)
)

不要循环。

© www.soinside.com 2019 - 2024. All rights reserved.