我已经在 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 个坐标实例的示例。
你的尝试
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')
)
根据您的评论,您真正想要的是
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)
)
不要循环。