将嵌套日期时间 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)')
说“谢谢”是值得赞赏的,但它并没有回答问题。相反,投票给 对您帮助最大的答案!如果这些答案对您有帮助,请考虑以更有建设性的方式表示感谢——对您的同行在这里提出的问题提供您自己的答案。
此处的问题与问题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)')
说“谢谢”是值得赞赏的,但它并没有回答问题。相反,投票给 对您帮助最大的答案!如果这些答案对您有帮助,请考虑以更有建设性的方式表示感谢——对您的同行在这里提出的问题提供您自己的答案。