1

我正在尝试在 html 页面上为上传的 csv 生成图表。问题是该页面没有生成图表,也没有将 csv 文件的内容生成到表格中,我真的不知道该怎么做, 请帮我。正如您从错误消息中看到的那样,问题似乎是它找不到“DateTime”键,这很奇怪,因为在 csv 文件中我得到了这个键。在这里你得到了代码和结果。结果. 我还添加了一张带有 csv 文件的图片在此处输入图像描述

import base64
import datetime
import io
import plotly.graph_objs as go
import cufflinks as cf

import dash
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import dash_table

import pandas as pd

external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
server = app.server

colors = {"graphBackground": "#F5F5F5", "background": "#ffffff", "text": "#000000"}

app.layout = html.Div(
[
    dcc.Upload(
    id="upload-data",
    children=html.Div(["Drag and Drop or ", html.A("Select Files")]),
    style={
          "width": "100%",
          "height": "60px",
          "lineHeight": "60px",
          "borderWidth": "1px",
          "borderStyle": "dashed",
          "borderRadius": "5px",
          "textAlign": "center",
          "margin": "10px",
        },
        # Allow multiple files to be uploaded
        multiple=True,
    ),
    dcc.Graph(id="Mygraph"),
    html.Div(id="output-data-upload"),
]
)



@app.callback(Output('Mygraph', 'figure'), [
Input('upload-data', 'contents'),
Input('upload-data', 'filename')
])

def update_graph(contents, filename):
    x = []
    y = []
    if contents:
       contents = contents[0]
       filename = filename[0]
       df = parse_data(contents, filename)
       df = df.set_index(df.columns[0])
       x = df['DateTime']
       y = df['Pressure_Inside']
       fig = go.Figure(
       data=[
        go.Scatter(
            x=x,
            y=y,
            mode='lines+markers')
        ],
    layout=go.Layout(
        plot_bgcolor=colors["graphBackground"],
        paper_bgcolor=colors["graphBackground"]
    ))
return fig


def parse_data(contents, filename):
   content_type, content_string = contents.split(",")

   decoded = base64.b64decode(content_string)
try:
    if "csv" in filename:
        # Assume that the user uploaded a CSV or TXT file
        df = pd.read_csv(io.StringIO(decoded.decode("utf-8")), delimiter=';')
    elif "xls" in filename:
        # Assume that the user uploaded an excel file
        df = pd.read_excel(io.BytesIO(decoded))
    elif "txt" or "tsv" in filename:
        # Assume that the user upl, delimiter = r'\s+'oaded an excel file
        df = pd.read_csv(io.StringIO(decoded.decode("utf-8")), delimiter=r"\s+")
except Exception as e:
    print(e)
    return html.Div(["There was an error processing this file."])

return df


@app.callback(
    Output("output-data-upload", "children"),
    [Input("upload-data", "contents"), Input("upload-data", "filename")],
)


def update_table(contents, filename):
    table = html.Div()

    if contents:
       contents = contents[0]
       filename = filename[0]
       df = parse_data(contents, filename)

       table = html.Div(
        [
            html.H5(filename),
            dash_table.DataTable(
                data=df.to_dict("rows"),
                columns=[{"name": i, "id": i} for i in df.columns],
            ),
            html.Hr(),
            html.Div("Raw Content"),
            html.Pre(
                contents[0:200] + "...",
                style={"whiteSpace": "pre-wrap", "wordBreak": "break-all"},
            ),
        ]
    )

return table


if __name__ == "__main__":
    app.run_server(debug=True)
4

1 回答 1

0

问题是它DateTime被视为索引df而不是列。

>>> df
                     Pressure_Inside  Pressure_outside  ...  Humidity_inside  Humidity_outside
DateTime                                                ...
2021-09-08 11:30:13           963.82            963.74  ...            50.14             48.35

所以你可以df.index在你现在使用的地方使用df['DateTime'].

于 2021-11-09T17:23:25.403 回答