【发布时间】:2021-12-01 15:52:38
【问题描述】:
我有以下代码。这段代码在仪表板上创建并显示一个 covid 数据。我需要向它添加一个日期选择器并显示适用于该范围的数据。
执行此操作时出现错误“ValueError: format number 1 of "2020-01-01" is not Recognized”。日期选择器输入的值无法转换为日期时间格式,以便我过滤掉记录属于初始数据框的该日期范围。非常感谢任何帮助。
由于这种不匹配,每当我尝试打印接收数据的数据类型或在比较日期的行期间都会遇到错误。
import pandas as pd
from dash import html
import plotly.graph_objects as go
from dash import dcc
import dash
import plotly.express as px
from dash.dependencies import Input, Output
from datetime import date
from datetime import datetime
import datetime
df = pd.read_excel("https://covid.ourworldindata.org/data/owid-covid-data.xlsx")
#
from numpy import dtype
app = dash.Dash()
# df = pd.read_csv('new2.csv', index_col=0)
print(df)
print(df.columns.tolist())
df.drop(
df.columns.difference(['continent', 'location', 'date', 'total_cases', 'new_cases', 'total_deaths', 'new_deaths']),
1, inplace=True)
print(df)
df.to_csv('new3.csv', encoding='utf-8', index=False)
app.layout = html.Div(id='parent', children=[
html.H1(id='H1', children='Covid Dashboard', style={'textAlign': 'center', \
'marginTop': 40, 'marginBottom': 40}),
dcc.DatePickerRange(
id='my-date-picker-range',
min_date_allowed=date(2020, 1, 1),
max_date_allowed=date.today(),
initial_visible_month=date(2020, 1, 1),
# end_date=date.today()
display_format='YYYY-MM-DD',
),
html.Div(id='output-container-date-picker-range'),
dcc.Dropdown(id='dropdown',
options=[
{'label': 'Total cases', 'value': 'total_cases'},
{'label': 'New cases', 'value': 'new_cases'},
{'label': 'Total_deaths', 'value': 'total_deaths'},
{'label': 'New deaths', 'value': 'new_deaths'},
],
value='total_cases'),
dcc.Graph(id='bar_plot')
])
@app.callback(Output(component_id='bar_plot', component_property='figure'),
[Input(component_id='dropdown', component_property='value'),
Input('my-date-picker-range', 'start_date'),
Input('my-date-picker-range', 'end_date')
])
def graph_update(dropdown_value, start_date, end_date):
print(dropdown_value)
print(start_date)
print(end_date)
start_date1 = '{}'.format(start_date)
end_date1 = '{}'.format(end_date)
# to get the world subset since the dataset contains multiple locations
worldwide_subset = df.loc[df['location'] == 'World']
if start_date is not None and end_date is not None:
# date_object = date.fromisoformat(start_date)
# print(date_object)
start_date_object = datetime.datetime.strptime(start_date1, '%Y-%m-%d').date()
end_date_object = datetime.datetime.strptime(end_date1, '%Y-%m-%d').date()
print('...............')
mask = (df['date'] > start_date_object) & (df['date'] <= end_date_object)
print(df.loc[mask])
used_df = df.loc[mask]
print(used_df)
else:
used_df = worldwide_subset
fig = go.Figure([go.Scatter(x=used_df['date'], y=df['{}'.format(dropdown_value)], \
line=dict(color='firebrick', width=4))
])
fig.update_layout(title=dropdown_value + ' over time',
xaxis_title='date',
yaxis_title=dropdown_value
)
return fig
if __name__ == '__main__':
app.run_server()
错误跟踪
[2021-12-01 21:12:24,710] ERROR in app: Exception on /_dash-update-component [POST]
Traceback (most recent call last):
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/flask/app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/flask/app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/flask/app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/flask/app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/dash/dash.py", line 1336, in dispatch
response.set_data(func(*args, outputs_list=outputs_list))
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/dash/_callback.py", line 151, in add_context
output_value = func(*func_args, **func_kwargs) # %% callback invoked %%
File "dimi2.py", line 86, in graph_update
mask = (df['date'] > start_date_object) & (df['date'] <= end_date_object)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/pandas/core/ops/common.py", line 69, in new_method
return method(self, other)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/pandas/core/arraylike.py", line 48, in __gt__
return self._cmp_method(other, operator.gt)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/pandas/core/series.py", line 5502, in _cmp_method
res_values = ops.comparison_op(lvalues, rvalues, op)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 284, in comparison_op
res_values = comp_method_OBJECT_ARRAY(op, lvalues, rvalues)
File "/home/sithijathewahettige/PycharmProjects/djangoProject/dash/venv/lib/python3.8/site-packages/pandas/core/ops/array_ops.py", line 73, in comp_method_OBJECT_ARRAY
result = libops.scalar_compare(x.ravel(), y, op)
File "pandas/_libs/ops.pyx", line 107, in pandas._libs.ops.scalar_compare
TypeError: '>' not supported between instances of 'str' and 'datetime.date'
【问题讨论】:
-
你能给出整个跟踪 - 最重要的是哪一行引发了错误?
-
掩码 = (df['date'] > start_date_object) & (df['date']
-
df["date"]大概是一个字符串。尝试在pd.read_excel之后执行df["date"] = pd.to_datetime(df["date"])
标签: python pandas dataframe plotly-dash