#python #pandas #dataframe #plotly-dash
Вопрос:
У меня есть приведенный ниже код. Этот фрагмент кода создает и отображает данные covid на панели мониторинга.Мне нужно добавить к этому указатель даты и отобразить данные, относящиеся к этому диапазону.
При этом я получаю ошибку «Ошибка значения: формат № 1 «2020-01-01″ не распознан».Значения, введенные датапикером, не могут быть преобразованы в формат datetime, чтобы я мог отфильтровать записи, относящиеся к этому диапазону дат, из исходного кадра данных.любая помощь в этом высоко ценится.
Из-за этого несоответствия я сталкиваюсь с ошибками всякий раз, когда пытаюсь напечатать тип данных полученных данных или во время строки, в которой я сравниваю даты.
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'] gt; start_date_object) amp; (df['date'] lt;= 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'] gt; start_date_object) amp; (df['date'] lt;= 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: 'gt;' not supported between instances of 'str' and 'datetime.date'
Комментарии:
1. можете ли вы дать всю трассировку — самое главное, в какой строке возникает ошибка?
2. маска = (df[‘дата’] gt; start_date_object) amp; (df[‘дата’] gt;
3.
df["date"]
предположительно, это строка. Попробуйте сделатьdf["date"] = pd.to_datetime(df["date"])
это послеpd.read_excel
Ответ №1:
Ошибка, которую вы получили TypeError: 'gt;' not supported between instances of 'str' and 'datetime.date'
, означает, что вам следует преобразовать строку ( str
) в date
, прежде чем вы сможете их отфильтровать. Вот пример:
import pandas as pd df = pd.DataFrame({ 'date':['2020-01-01','2020-02-02','2020-03-03','2021-12-01']}) print(df)
Фрейм данных:
date 0 2020-01-01 1 2020-02-02 2 2020-03-03 3 2021-12-01
Если вы type(df['date'][0])
, то вы видите, что это а str
, но если вы pd.to_datetime(df['date'])[0]
, то тип Timestamp('2020-01-01 00:00:00')
Выполнение pd.to_datetime(df['date'])
выведет:
0 2020-01-01 1 2020-02-02 2 2020-03-03 3 2021-12-01 Name: date, dtype: datetime64[ns]
Вы можете фильтровать даты, делая:
df[(df['date'] gt; '2020-01-20') amp; (df['date'] lt; '2021-03-20')]
выход:
date 1 2020-02-02 2 2020-03-03