【问题标题】:TypeError: Object of type 'DataFrame' is not JSON serializableTypeError:“DataFrame”类型的对象不是 JSON 可序列化的
【发布时间】:2019-01-17 02:58:01
【问题描述】:

我正在尝试使用从我的 PostgreSQL 服务器获得的一些数据创建一个绘图图表,但是当我尝试绘制图表时出现错误:“TypeError: Object of type 'DataFrame' is not JSON serializable "

到目前为止的代码如下:

import dash
import numpy as np
import pandas as pd
import plotly.offline as py
import plotly.graph_objs as go
import psycopg2 as pg2
import datetime

conn = pg2.connect(database='X',user='X',password=secret)

cur = conn.cursor()

cur.execute("SELECT * FROM times;")
a = cur.fetchall()
str(a)


df = pd.DataFrame([[ij for ij in i] for i in a])
df.to_json()
df.rename(columns={0: "Serial Number", 1: "Status", 2: "Date", 3: "Time", 4: "Number"}, inplace=True);

x = df["Date"]
data = [go.Scatter(
            x=x,
            y=df["Status"])]

layout = go.Layout(title="Server Data Visualization",
                   xaxis = dict(
                   range = [df.head(1),
                            df.tail(1)]),
                    yaxis=dict(title = "Status"))

fig = go.Figure(data = data, layout = layout)
py.plot(fig)

df["Date"] 是“2018-08-03”格式的日期,df["Status"] 是“Uptime”或“Downtime”。

谁能告诉我我做错了什么?我试图让这张图基本上是从 sql 服务器读取的 x 轴上的日期,然后是 y 轴上的两个值,它们代表“正常运行时间”或“停机时间”的值。

Traceback (most recent call last):
  File "\\srv31data1\users$\User\Desktop\basic.py", line 37, in <module>
    py.plot(fig)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\offline\offline.py", line 469, in plot
    '100%', '100%', global_requirejs=False)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\offline\offline.py", line 184, in _plot_html
    cls=utils.PlotlyJSONEncoder)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\utils.py", line 161, in encode
    encoded_o = super(PlotlyJSONEncoder, self).encode(o)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\plotly\utils.py", line 229, in default
    return _json.JSONEncoder.default(self, obj)
  File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'DataFrame' is not JSON serializable

编辑:抱歉,忘记发布回溯!

【问题讨论】:

  • 你也可以发布堆栈跟踪吗?想知道代码面临错误的行。
  • 刚刚更新,谢谢

标签: python-3.x postgresql pandas plotly psycopg2


【解决方案1】:
df = pd.read_csv(data)
return_data = {
    "status": 1,
    "message": "Raw Data List with pagination",
    "data": {
        "is_header": is_header,
        "head": **json.loads(df.head().to_json())**
    }
}

【讨论】:

  • df.head().to_dict()使用更方便。
【解决方案2】:

您的df 仍然是一个数据框,因为您尚未将其分配为 json。

   df = df.to_json()

这应该可行。如果没有,请告诉我。

【讨论】:

  • 我发现这种方法存在很多格式问题,使用to_dict()效果更好,并且不添加随机转义字符。熊猫版1.0.5
  • 要使每行具有相同的效果,您应该这样做: df['json'] = df.apply(lambda x: x.to_json(), axis=1) 按照此处的说明:stackoverflow.com/questions/36051134/pandas-row-to-json/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2019-11-21
  • 2021-11-13
  • 2018-09-22
  • 2019-12-07
  • 2023-01-20
相关资源
最近更新 更多