Ошибка ключа: значение даты

#python #pandas #datetime

Вопрос:

Я получил csv-файл со следующими столбцами: Провинция/Штат, Страна/Регион, Длина 1/22/20, 1/23/20 …

Это фрейм данных:

 Country/Region  1/22/20     1/23/20     1/24/20
Afghanistan     100         200          300
Albania         400         500           0
Algeria          20          30           70   
 

Я пытаюсь получить функцию с входными данными: csv-файл и последнюю дату, которую я хочу отфильтровать.

Здесь я показываю функцию, которую я выполнил:

 def create_covid_pickle (csv_doc, date):
    csv_doc = pd.read_csv(csv_doc)
    # assign correct format to date
    date = datetime.datetime.strptime(date,"%m-%d-%y")
    date = date.strftime("%m/%d/%y")
        
    # delete columns I don't need
    csv_doc = csv_doc.loc[:, 'Country/Region': date]
    csv_doc = csv_doc.drop(columns = ['Lat', 'Long'])
    
    # to_dict
    #     csv_dictionary = csv_doc.to_dict()
    csv_dictionary = [{c: {'time': d.columns.tolist(), 'cases': d.values.tolist()[0]}} 
                      for c, d in csv_doc.set_index(['Country/Region']).groupby('Country/Region')]
      
    return csv_dictionary

 

Я получаю 2 ошибки в csv_doc = csv_doc.loc[:, 'Country/Region': date] Первый, при использовании .loc[] , а второй из-за даты date

Полное сообщение об ошибке отображается следующим образом

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4844             try:
-> 4845                 return self._searchsorted_monotonic(label, side)
   4846             except ValueError:

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in _searchsorted_monotonic(self, label, side)
   4805 
-> 4806         raise ValueError("index must be monotonic increasing or decreasing")
   4807 

ValueError: index must be monotonic increasing or decreasing

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-2-a84a2fe01741> in <module>
      1 # Test
----> 2 create_covid_pickle("data/time_series_covid19_confirmed_global.csv", "01-06-20")
      3 
      4 # Load and print some data
      5 # country_cases = pickle.load(open("primera_ola.pkl", "rb"))

<ipython-input-1-1c34e9c20811> in create_covid_pickle(csv_doc, date)
     29 
     30     # seleccionar columnas - crear funcion 1 indepte?
---> 31     csv_doc = csv_doc.loc[:, 'Country/Region': date]
     32 
     33 #     REVISAR FUNCION CON NUEVOS CAMBIOS DE LAS LINEAS ANTERIORES

~/.local/lib/python3.8/site-packages/pandas/core/indexing.py in __getitem__(self, key)
   1760                 except (KeyError, IndexError, AttributeError):
   1761                     pass
-> 1762             return self._getitem_tuple(key)
   1763         else:
   1764             # we by definition only have the 0th axis

~/.local/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
   1287                 continue
   1288 
-> 1289             retval = getattr(retval, self.name)._getitem_axis(key, axis=i)
   1290 
   1291         return retval

~/.local/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1910         if isinstance(key, slice):
   1911             self._validate_key(key, axis)
-> 1912             return self._get_slice_axis(key, axis=axis)
   1913         elif com.is_bool_indexer(key):
   1914             return self._getbool_axis(key, axis=axis)

~/.local/lib/python3.8/site-packages/pandas/core/indexing.py in _get_slice_axis(self, slice_obj, axis)
   1794 
   1795         labels = obj._get_axis(axis)
-> 1796         indexer = labels.slice_indexer(
   1797             slice_obj.start, slice_obj.stop, slice_obj.step, kind=self.name
   1798         )

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in slice_indexer(self, start, end, step, kind)
   4711         slice(1, 3)
   4712         """
-> 4713         start_slice, end_slice = self.slice_locs(start, end, step=step, kind=kind)
   4714 
   4715         # return a slice

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in slice_locs(self, start, end, step, kind)
   4930         end_slice = None
   4931         if end is not None:
-> 4932             end_slice = self.get_slice_bound(end, "right", kind)
   4933         if end_slice is None:
   4934             end_slice = len(self)

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4846             except ValueError:
   4847                 # raise the original KeyError
-> 4848                 raise err
   4849 
   4850         if isinstance(slc, np.ndarray):

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_slice_bound(self, label, side, kind)
   4840         # we need to look up the label
   4841         try:
-> 4842             slc = self.get_loc(label)
   4843         except KeyError as err:
   4844             try:

~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2646                 return self._engine.get_loc(key)
   2647             except KeyError:
-> 2648                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2649         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2650         if indexer.ndim > 1 or indexer.size > 1:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '01/06/20'

 

Я думал, что строки, относящиеся к дате и времени, должны избегать этой проблемы, но это не так.

Как я могу это решить?

Спасибо

Комментарии:

1. Привет, в чем цель csv_doc.loc[:, 'Country/Region': date] ?

2. Опубликуйте образец вашего фрейма данных и желаемый результат.

3. @Laurent: Я хочу выбрать только некоторые столбцы. От «Страны/региона» до тех пор, пока он не будет показан в выбранной дате

4. @AmitVikramSingh: Я отредактировал информацию, вы правы

5. @icatalan Добавьте полную обратную трассировку ошибок.

Ответ №1:

date.strftime("%m/%d/%y") возвращает 01/31/20 , в то время как один и тот же столбец в вашем фрейме данных помечен 1/31/20 , таким образом, несоответствие.

Я бы посоветовал вам попробовать это:

 def create_covid_pickle (csv_doc, date):
    csv_doc = pd.read_csv(csv_doc)

    # properly format csv_doc columns
    csv_doc.columns = [
    datetime.datetime.strptime(col, "%m/%d/%y").strftime("%m/%d/%y")
    if col.replace("/", "").isnumeric()
    else col
    for col in csv_doc.columns
    ]
    
    # assign correct format to date
    date = datetime.datetime.strptime(date,"%m-%d-%y")
    date = date.strftime("%m/%d/%y")

    # Sort columns
    csv_doc = csv_doc.sort_index(axis=1, ascending=False)
        
    # delete columns I don't need
    csv_doc = csv_doc.loc[:, 'Country/Region': date]
    ...
 

Комментарии:

1. при таком изменении формата проблема заключается в том, что существуют столбцы, подобные тем, Province/State - Country/Region - Lat Long которые недопустимы для этого синтаксиса

2. В этом случае вы можете добавить проверку условий, см. Мой обновленный ответ.

3. большое спасибо. Я добавил это. Ошибка остается. KeyError: '1-31-20'`````Some errors are shown before. The first one is: Обратная трассировка ошибки значения (последний последний вызов) ~/.local/lib/python3.8/site-packages/pandas/core/indexes/base.py в get_slice_bound(сам, метка, сторона, вид) …«

4. Привет @Laurent, Столбцы в файле CSV отображаются в формате dd/mm/yy , в то время как входные данные приведены в формате dd-mm-yy . Моя цель-правильно задать значение входных данных в формате «дд/мм/гг«», чтобы избежать проблем.

5. Я переспрошу об этом на веб-сайте, так как не смог решить эту проблему. Я попытаюсь задать этот вопрос по-другому.