pandas DataFrame 使用 to_json() 到字典列表

Posted

技术标签:

【中文标题】pandas DataFrame 使用 to_json() 到字典列表【英文标题】:pandas DataFrame to list of dicts using to_json() 【发布时间】:2018-10-22 05:56:43 【问题描述】:

所以,我正在用 pandas 读取 xlsx 文件,然后解析日期时间(excel 是浮点数)

然后我需要把它解析成Json,我遇到了一些问题。

第 1 步(使用 to_json() 解析之前)

df = pandas.read_excel('test.xlsx', names=['date', 'value', 'source'])
df['date'] = pandas.to_datetime(df['date'], format='%b %d %Y.%f')
print(df)

回报是

        date  value                            source
0 2012-05-22      1              xxxxxxxxxxxxxxxxxxxx
1 2012-05-25      1                     xxxxxxxxxxxxx
2 2012-05-30      1  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3 2012-06-01      1                        xxxxxxxxxx
4 2012-06-08      1                 xxxxxxxxxxxxxxxxx

一切似乎都很好,然后我得到了 o to_json

payload = df.to_json()

而回报是

"date":"0":1337644800000,"1":1337904000000,"2":1338336000000,"3":1338508800000,"4":1339113600000,"value":"0":1,"1":1,"2":1,"3":1,"4":1,"source":"0":"xxxxxxxxxxxxxxx","1":"xxxxxxxxxx","2":"xxxxxxxxxxx","3":"xxxxxxxxxxxxxxxx","4":"xxxxxxxxxxxxxxx"

那么我做错了什么?我在 to_json() 上缺少 args 吗?哈尔普请:c

我需要它是这样的:

["date":"2012-05-22","value":1,"source":"xxxxxxxxxxxxxxxxxxxx",
"date":"2012-05-25","value":1,"source":"xxxxxxxxxxxxxxxxxxxx",
"date":"2012-05-30","value":1,"source":"xxxxxxxxxxxxxxxxxxxxx",
"date":"2012-06-01","value":1,"source":"xxxxxxxxxxxxxxxxxxxx",
"date":"2012-06-08","value":1,"source":"xxxxxxxxxxxxxxxxxxxxxx"]

【问题讨论】:

看起来您的日期时间对象被强制转换为 unix 时间戳。这是一个问题吗?你想要它是什么?字符串?然后只需执行df['date'] = pandas.to_datetime(df['date'], format='%b %d %Y.%f').astype(str) 并照常进行。 已编辑!对不起:p 您也可以使用df.to_json(orient='records') 来获得所需的输出。 @GabrielFernandes 是的,在我写的答案中已经提到过。干杯。 【参考方案1】:

您需要进行一些修复——

    将您的日期列转换为字符串,因为就目前而言,您的日期时间列被强制转换为 Unix 整数时间戳。或者,按照其他答案的建议,将 date_format 参数与 to_json 一起使用。 保存为json时改变方向;指定orient='records'

df['date'] = pandas.to_datetime(df['date'], format='%b %d %Y.%f').astype(str)
payload = df.to_json(orient='records')

print(payload)
'["date":"2012-05-22","source":"xxxxxxxxxxxxxxxxxxxx","value":1,"date":"2012-05-25","source":"xxxxxxxxxxxxxxxxxxxx","value":1,"date":"2012-05-30","source":"xxxxxxxxxxxxxxxxxxxxx","value":1,"date":"2012-06-01","source":"xxxxxxxxxxxxxxxxxxxx","value":1,"date":"2012-06-08","source":"xxxxxxxxxxxxxxxxxxxxxx","value":1]'

【讨论】:

【参考方案2】:

虽然如果您转换为字符串(如其他问题和 cmets 中所述)您可以获得所需的格式,但您可能不需要。查看 to_json() parameter date_format。我相信你想要.to_json(..., date_format='iso')

根据date_format 参数的文档:

对于 orient='table',默认为'iso'。对于所有其他方向,默认值为“epoch”。

【讨论】:

这将导致日期格式类似于 2012-05-22T00:00:00.000Z,这不是 OP 想要的输出。

以上是关于pandas DataFrame 使用 to_json() 到字典列表的主要内容,如果未能解决你的问题,请参考以下文章

使用另一个 pandas DataFrame 更新存储在 Pytable 中的 pandas DataFrame

#pandas使用merge函数将两个pandas dataframe通过笛卡尔积(cartesian product)方式连接起来生成新的dataframe数据

使用均值合并 Pandas 中的 DataFrame

使用 pandas dataframe.query() 选择列

004.pandas.DataFrame

004.pandas.DataFrame