Замена пропусков даты в Pandas Dataframe
Есть DataFrame где имеется «Дата начала события» (date), «Количество дней от даты события до даты окончания» (int64) где имеются пропущенные значения. Задача - заполнить пропущенные значения считая, что дата окончания у всех пропущенных значений одна.
Пытался сделать разными способами, но постоянно при работе возникали ошибки. Включая то, что при расчете Дата окончания - Дата начала полученное количество дней при переводе в int даёт слишком большие значения.
Также возникла такая ошибка "None of [Int64Index([ 0, 81, 558, 424, 121, 55, 155, 0, 189, 289,\n ...\n 29, 15, 519, 413, 239, 0, 45, 0, 602, 0],\n dtype='int64', length=23699)] are in the [columns]"
data['day_exposition_status'] = data['days_exposition'].isna()
data['days_exposition'].fillna(0, inplace=True)
data['days_exposition'] = data['days_exposition'].astype('int')
zero_days_exposition = datetime.datetime(2020, 4, 27) - data['first_day_exposition']
data['days_exposition'] = data[data['days_exposition']].replace(to_replace = 0, value = zero_days_exposition)
Пример DataFrame - https://pastebin.com/vWeyedxv
Полностью текст ошибки
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-24-cccce5c1358b> in <module>
1 data['days_exposition'] = data['days_exposition'].astype('int')
2 zero_days_exposition = datetime.datetime(2020, 4, 27) - data['first_day_exposition']
----> 3 data['days_exposition'] = data[data['days_exposition']].replace(to_replace = 0, value = zero_days_exposition)
/opt/conda/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
2984 if is_iterator(key):
2985 key = list(key)
-> 2986 indexer = self.loc._convert_to_indexer(key, axis=1, raise_missing=True)
2987
2988 # take() does not accept boolean indexers
/opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py in _convert_to_indexer(self, obj, axis, is_setter, raise_missing)
1283 # When setting, missing keys are not allowed, even with .loc:
1284 kwargs = {"raise_missing": True if is_setter else raise_missing}
-> 1285 return self._get_listlike_indexer(obj, axis, **kwargs)[1]
1286 else:
1287 try:
/opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py in _get_listlike_indexer(self, key, axis, raise_missing)
1090
1091 self._validate_read_indexer(
-> 1092 keyarr, indexer, o._get_axis_number(axis), raise_missing=raise_missing
1093 )
1094 return keyarr, indexer
/opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py in _validate_read_indexer(self, key, indexer, axis, raise_missing)
1175 raise KeyError(
1176 "None of [{key}] are in the [{axis}]".format(
-> 1177 key=key, axis=self.obj._get_axis_name(axis)
1178 )
1179 )
KeyError: "None of [Int64Index([ 0, 81, 558, 424, 121, 55, 155, 0, 189, 289,\n ...\n 29, 15, 519, 413, 239, 0, 45, 0, 602, 0],\n dtype='int64', length=23699)] are in the [columns]"
Ответы (2 шт):
Если я правильно понял вопрос:
zero_days_exposition = datetime.datetime(2020, 4, 27) - data['first_day_exposition']
data["days_exposition"] = data["days_exposition"].fillna(0).replace(0, zero_days_exposition.dt.days)
результат:
In [243]: data
Out[243]:
first_day_exposition days_exposition
0 2019-03-07 417.0
1 2018-12-04 81.0
2 2015-08-20 558.0
3 2015-07-24 424.0
4 2018-06-19 121.0
5 2018-09-10 55.0
6 2017-11-02 155.0
7 2019-04-18 375.0
8 2018-05-23 189.0
9 2017-02-26 289.0
10 2017-11-16 137.0
11 2018-08-27 7.0
12 2016-06-30 90.0
13 2017-07-01 366.0
14 2016-06-23 203.0
15 2017-11-18 19.0
16 2017-11-23 397.0
@MaxU спасибо, сработало, подскажите если есть возможность, пока думал над решением написал такой код, но он отрабатывает немного не правильно
zero_days_exposition = (datetime.datetime(2020, 4, 27) - data['first_day_exposition'])
data['days_exposition'].fillna(0, inplace=True)
for row in data['days_exposition']:
if row == 0:
data['days_exposition'] = data['days_exposition'][data.index == row].replace(to_replace = 0, value = zero_days_exposition)
else:
data['days_exposition']
Он выводит в ячейку сообщения типа 417.0 [00.00.00]