将嵌套日期时间 json 转换为 Pandas DataFrame

Convert Nested DateTime json to Pandas DataFrame

此处的问题与问题here, here, and here中定义的问题不同。具体来说,我想要的输出的转换和形式与那些问题中指定的不同,我还想要一个 DateTime 索引。这些差异导致这些页面上的答案失败。

我将数据格式化为 json,如下所示:

{
    "Meta Data": {
        "1. Information": "Daily Prices (open, high, low, close) and Volumes",
        "2. Symbol": "ABC",
    },
    "Time Series (Daily)": {
        "2001-06-31": {
            "1. open": "113.2000",
            "4. close": "113.8000",
        },
        "2001-07-01": {
            "1. open": "114.2000",
            "4. close": "114.2000",
        }
    }
}

我希望输出看起来像这样的 pandas 数据帧:

"Time Series (Daily)" | "1. open" | "4. close"
"2001-06-31"          | 113.2000  | 113.8000
"2001-07-01"          | 114.2000  | 114.2000

我写了一个可以工作的函数,但是 for 循环让性能欠佳而且我觉得它很难阅读。

def convert_json_to_dataframe(all_json_data):
    json_data = all_json_data["Time Series (Daily)"]
    dates = []
    open = []
    close = []
    for key in json_data.keys():
        dates.append(key)
        open.append(json_data[key]["1. open"])
        close.append(json_data[key]["4. close"])
    df = pd.DataFrame(
        list(zip(open, close)),
        columns=["1. open", "4. close"],
        index=dates,
    )
    df = df.apply(pd.to_numeric, errors="ignore")
    return df

必须有一种更简单、更容易阅读、性能更高的方法来做到这一点,也许 pandas 中的 json_normalize,但我想不通。


回答和解决后更新。 我所要做的就是:

df = pd.DataFrame(json_data["Time Series (Daily)"]).T

Pandas 自动发现了索引和列名,所以我不需要答案的 reset_index 部分。

orient 方法也有效:

df = pd.DataFrame.from_dict(json_data["Time Series (Daily)", orient="index")

要将所有数字作为浮点数而不是字符串,我确实需要 apply 行:

df = df.apply(pd.to_numeric, errors="coerce")

谢谢大家

似乎相关数据只在 "Time Series (Daily)" 键下,所以你可以得到它并构建一个 DataFrame(使用 orient 参数来获得正确的形状):

out = pd.DataFrame.from_dict(my_data['Time Series (Daily)'], orient='index')

输出:

            1. open  4. close
2001-06-31  113.2000  113.8000
2001-07-01  114.2000  114.2000

你为什么不这样做呢?

pd.DataFrame(data["Time Series (Daily)"]).T.reset_index().rename(columns = {"index":"Time Series (Daily)"})

输出-

Time Series (Daily) 1. open 4. close
0 2001-06-31 113.2000 113.8000
1 2001-07-01 114.2000 114.2000

从 URL 中获取 json 是最简单的方法:

import requests
url='url from json file'
r=requests.get(url)
data=r.json()
df=pd.DataFrame(data['Time Series (Daily)']).T
df=df.reset_index('Time Series (Daily)')

说“谢谢”是值得赞赏的,但它并没有回答问题。相反,投票给 对您帮助最大的答案!如果这些答案对您有帮助,请考虑以更有建设性的方式表示感谢——对您的同行在这里提出的问题提供您自己的答案。