Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新编码JSON文件Python_Python_Json_Mongodb - Fatal编程技术网

重新编码JSON文件Python

重新编码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"

我有一项艰巨的任务,那就是从一种格式下载一个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": "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
in
out\u data
,键为
“2018-07-13”
,并在该dict内根据需要为每小时创建一个dict

令人惊讶的是,这个问题让我头痛了一个星期,你用几行就解决了,也谢谢你的解释,正如你说的,我认为嵌套数据结构缺少一些知识,我的输出不正确。dict中有两个相等的键,你的输出正好是我需要的。最后一个问题,是否可以每天创建一个变量?我想每天在MongoDB上添加一个文档。@FernandoSilva对不起,我不知道MongoDB,所以我不能给你任何具体的建议。我的代码将处理与问题中的格式匹配的任何数量的数据。它将为输入数据中看到的每一天创建一个单独的
dict
。我正在分析你的代码,最好的请求将是每天过滤并上传一次,再次感谢你,你真的帮了我很多。