Тип данных Python не распознан

#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