Замена пропусков даты в 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 шт):

Автор решения: MaxU

Если я правильно понял вопрос:

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
→ Ссылка
Автор решения: Anofelesoff

@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]

→ Ссылка