【问题标题】:pandas DataFrame to list of dicts using to_json()pandas DataFrame 使用 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 是的,在我写的答案中已经提到过。干杯。

标签: python json string pandas datetime


【解决方案1】:

您需要进行一些修复——

  1. 将您的日期列转换为字符串,因为就目前而言,您的日期时间列被强制转换为 Unix 整数时间戳。或者,按照其他答案的建议,将 date_format 参数与 to_json 一起使用。
  2. 保存为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 想要的输出。
    猜你喜欢
    • 2017-12-26
    • 2019-06-27
    • 1970-01-01
    • 2019-02-08
    • 2019-01-05
    • 2015-12-22
    • 2016-07-24
    • 2014-01-05
    相关资源
    最近更新 更多