Python 如何使用具有相同列名的熊猫规范化JSON时间序列

Python 如何使用具有相同列名的熊猫规范化JSON时间序列,python,json,pandas,Python,Json,Pandas,我想使用具有以下格式的时间序列数据的api: ... "value":[ { "Key":"bt386", "ReferenceDate":"2019-07-27T00:00:00Z", "TargetDate":"2019-07-28T00:00:00Z", "PublicationDate":null, "ChangedOn":"2019-07-27T09:36:03.9727098+01:00", "ValidUntil":"9999-12- 31T23:59:59.9999999Z",

我想使用具有以下格式的时间序列数据的api:

...
"value":[
{
"Key":"bt386",
"ReferenceDate":"2019-07-27T00:00:00Z",
"TargetDate":"2019-07-28T00:00:00Z",
"PublicationDate":null,
"ChangedOn":"2019-07-27T09:36:03.9727098+01:00",
"ValidUntil":"9999-12- 
31T23:59:59.9999999Z",
"ValueColumnsNumber":[ 
{"Key":"FreshSnowDepth","Value":0.000000000}, 
{"Key":"Precipitation","Value":0.000000000}, 
{"Key":"RainSnowMelt","Value":0.000000000}, 
{"Key":"Runoff","Value":31.800000000}, 
{"Key":"SnowDepth","Value":0.000000000}, 
{"Key":"SnowDepthNormalPerc","Value":0.000000000}, 
{"Key":"SnowMelt","Value":0.000000000}, 
{"Key":"SnowWaterEquivalents","Value":0.000000000}, 
{"Key":"Temperature","Value":18.450000000}],"ValueColumnsText": 
[],"ValueColumnsDateTime":[]},
{
"Key":"bt386",
"ReferenceDate":"2019-07-27T00:00:00Z",
"TargetDate":"2019-07-29T00:00:00Z",
"PublicationDate":null,
"ChangedOn":"2019-07- 
27T09:36:03.9727098+01:00",
"ValidUntil":"9999-12-31T23:59:59.9999999Z",
"ValueColumnsNumber":[ 
{"Key":"FreshSnowDepth","Value":0.000000000}, 
{"Key":"Precipitation","Value":0.000000000}, 
{"Key":"RainSnowMelt","Value":0.000000000}, 
{"Key":"Runoff","Value":28.400000000}, 
{"Key":"SnowDepth","Value":0.000000000}, 
{"Key":"SnowDepthNormalPerc","Value":0.000000000}, 
{"Key":"SnowMelt","Value":0.000000000}, 
{"Key":"SnowWaterEquivalents","Value":0.000000000}, 
{"Key":"Temperature","Value":18.750000000}],
"ValueColumnsText": 
[],
"ValueColumnsDateTime":[]
}
]
我尝试了以下代码:

d = json.loads(response.content)
timeSeries = json_normalize(data=d['value'], 
record_path='ValueColumnsNumber',
meta=['ReferenceDate', 'TargetDate'])

table = timeSeries.pivot_table('Value', ['ReferenceDate', 'TargetDate'], 
'Key')
table.reset_index(drop=False, inplace=True)
pd.set_option('display.max_columns', None)

print(table.head(3))

Key         ReferenceDate            TargetDate  FreshSnowDepth
0    2017-03-22T00:00:00Z  2017-03-23T00:00:00Z             2.8   
1    2017-03-22T00:00:00Z  2017-03-24T00:00:00Z             7.6   
2    2017-03-22T00:00:00Z  2017-03-25T00:00:00Z             0.3   
我需要的是还包括字母数字键

Key       CurveKey       ReferenceDate            TargetDate  FreshSnowDepth
0         bt386   2017-03-22T00:00:00Z  2017-03-23T00:00:00Z             2.8   
1         bt386   2017-03-22T00:00:00Z  2017-03-24T00:00:00Z             7.6   
2         abcde   2017-03-22T00:00:00Z  2017-03-25T00:00:00Z             0.3  

 timeSeries = json_normalize(data=d['value'], 
 record_path='ValueColumnsNumber',
 meta=['Key', 'ReferenceDate', 'TargetDate'])
更改
json\u normalize()
函数时,出现以下错误:

ValueError:元数据名称键冲突,需要区分前缀

要将json转换为所需的格式,我需要做什么?

试试以下方法:

table = pd.io.json.json_normalize(d, ['value', 'ValueColumnsNumber'], meta=[
    ['value', 'Key'],
    ['value', 'ReferenceDate'],
    ['value', 'TargetDate'],
])
记录路径
应该是要循环的最深级别
meta
包含您想要抓住的较浅层次的任何内容

结果:

              Key  Value value.Key   value.ReferenceDate      value.TargetDate
0  FreshSnowDepth    0.0     bt386  2019-07-27T00:00:00Z  2019-07-28T00:00:00Z
1   Precipitation    0.0     bt386  2019-07-27T00:00:00Z  2019-07-28T00:00:00Z
2    RainSnowMelt    0.0     bt386  2019-07-27T00:00:00Z  2019-07-28T00:00:00Z
3          Runoff   31.8     bt386  2019-07-27T00:00:00Z  2019-07-28T00:00:00Z
4       SnowDepth    0.0     bt386  2019-07-27T00:00:00Z  2019-07-28T00:00:00Z