#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. Я переспрошу об этом на веб-сайте, так как не смог решить эту проблему. Я попытаюсь задать этот вопрос по-другому.