numpy Python:JSON数据的3D网格

2vuwiymt  于 2023-08-05  发布在  Python
关注(0)|答案(1)|浏览(121)

我一直在与Python相关的问题(或挑战)斗争了很长一段时间。现在我相信我应该从你们那里得到一些帮助或提示。
attached file中,您将找到一个JSON文件对象,其中包含我正在处理的数据。我使用以下代码行加载数据:

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

字符串
现在,当查看json_object时,您将注意到许多相关信息,例如2D维度中的单元格数量,NumxNumy。现在,我感兴趣的键/参数是data键,即json_object['data']。此参数是一个列表项,保存Numx x x x 1 m6n1x字典示例,并保存每个示例的X和Y坐标。每个示例还保存第3维,即键Data中的时间维,它是一个列表项,保存n个时间步长的值。这可能很明显,但我觉得我应该提到每个坐标示例的时间戳都是相同的。
因此,总而言之,对于每个坐标,都有一个带值的时间序列,我想使用numpy将其转换为3D维网格。我该怎么做?
我尝试将data键转换为Pandas DataFrame:

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


这给了我一个DataFrame,其值对应于给定的时间步长和坐标。但我不知道如何继续-我如何把它变成一个3D网格?
然后我尝试循环每个时间戳,所以我会有n个时间步长的2D网格。但后来我挣扎着如何实现时间,以使它三维。

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个坐标示例的示例。

dm7nw8vv

dm7nw8vv1#

你的企图

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

字符串
基本上是正确的。然后你会问:
我怎么把这个变成3D网格?
也许你指的是一个2D值数组,但这会因许多因素而变得复杂,包括你有很多重复项,数据中有不规则的网格覆盖:

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


x1c 0d1x的数据
如果你实际上想要三个索引(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被零填充的帧;
  • 时间的外部索引,然后是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)
)


不要循环。

相关问题