重新编码JSON文件Python
我有一项艰巨的任务,那就是从一种格式下载一个json文件,然后用另一种格式重新编码,然后上传到MongoDB中。我的json文件来自Alpha Vantage(),格式如下重新编码JSON文件Python,python,json,mongodb,Python,Json,Mongodb,我有一项艰巨的任务,那就是从一种格式下载一个json文件,然后用另一种格式重新编码,然后上传到MongoDB中。我的json文件来自Alpha Vantage(),格式如下 "Time Series (1min)": { "2018-07-13 16:00:00": { "1. open": "105.4550", "2. high": "105.5600", "3. low": "105.3900", "4. close"
"Time Series (1min)": {
"2018-07-13 16:00:00": {
"1. open": "105.4550",
"2. high": "105.5600",
"3. low": "105.3900",
"4. close": "105.4300",
"5. volume": "2484606"
},
"2018-07-13 15:59:00": {
"1. open": "105.5300",
"2. high": "105.5300",
"3. low": "105.4500",
"4. close": "105.4600",
"5. volume": "216617"
}
我需要根据下面的模式使用天、小时和分钟作为键对文件重新编码
{
'2018-07-13': {
'16': {
'00': {'open': 105.4550,
'high': 105.5600,
'low': 105.3900,
'close': 105.4300,
'volume': 2484606,}
}
}
'2018-07-13': {
'15': {
'59': {'open': 105.53000,
'high': 105.5300,
'low': 105.4500,
'close': 105.4600,
'volume': 6484606,}
}
}
}
我做了很多研究,但我没有弄清楚如何使用循环构造包含多个键的字典,同时我阅读了我想在Dict中重新编码的json文件。我同意,如果不习惯使用嵌套数据结构,可能会有点混乱,但如果小心的话,这并不难。诀窍是如果内部字典还不存在,就创建它们。我们可以用这种方法做到这一点 我们还需要将内部数据从字符串转换为数字。但是如果数字不包含小数点,我们希望它们是整数,否则我们需要浮点。我的
str_to_num
函数中显示了通常的方法。首先,我们尝试转换为整数,如果转换失败,我们将转换为浮点。如果由于数据错误而失败,程序将引发ValueError异常并终止。您可能希望以不同的方式处理此问题(如忽略坏数据)
我假设您知道如何使用时间序列(1min)
键从最外层提取所需数据。下面的代码使用标准的json
模块简单地将新格式的数据转换回json,以便我们可以很好地打印它
import json
alpha_data = {
"2018-07-13 16:00:00": {
"1. open": "105.4550",
"2. high": "105.5600",
"3. low": "105.3900",
"4. close": "105.4300",
"5. volume": "2484606"
},
"2018-07-13 15:59:00": {
"1. open": "105.5300",
"2. high": "105.5300",
"3. low": "105.4500",
"4. close": "105.4600",
"5. volume": "216617"
}
}
def str_to_num(s):
try:
n = int(s)
except ValueError:
n = float(s)
return n
# Where we'll store the output
out_data = {}
for timestamp, data in alpha_data.items():
datestr, timestr = timestamp.split()
hr, mn, _ = timestr.split(':')
# Fetch inner dicts, creating them if they don't exist yet
d = out_data.setdefault(datestr, {})
d = d.setdefault(hr, {})
d[mn] = {k.split()[1]: str_to_num(v) for k, v in data.items()}
print(json.dumps(out_data, indent=4))
输出
{
"2018-07-13": {
"16": {
"00": {
"open": 105.455,
"high": 105.56,
"low": 105.39,
"close": 105.43,
"volume": 2484606
}
},
"15": {
"59": {
"open": 105.53,
"high": 105.53,
"low": 105.45,
"close": 105.46,
"volume": 216617
}
}
}
}
您会注意到我的输出与您期望的输出不完全相同。这是因为Python字典中的键是唯一的:不能在同一个
dict
中有两个键为“2018-07-13”
的项。因此,我的代码创建了一个dict
inout\u data
,键为“2018-07-13”
,并在该dict内根据需要为每小时创建一个dict 令人惊讶的是,这个问题让我头痛了一个星期,你用几行就解决了,也谢谢你的解释,正如你说的,我认为嵌套数据结构缺少一些知识,我的输出不正确。dict中有两个相等的键,你的输出正好是我需要的。最后一个问题,是否可以每天创建一个变量?我想每天在MongoDB上添加一个文档。@FernandoSilva对不起,我不知道MongoDB,所以我不能给你任何具体的建议。我的代码将处理与问题中的格式匹配的任何数量的数据。它将为输入数据中看到的每一天创建一个单独的dict
。我正在分析你的代码,最好的请求将是每天过滤并上传一次,再次感谢你,你真的帮了我很多。