Pandas, обработка временной метки за пределами границ

У меня есть df с определенными функциями в качестве типов объектов, которые я хочу преобразовать в типы дат. Когда я пытаюсь преобразовать с помощью pd.to_datetime, некоторые из этих функций возвращают сообщение об ошибке «Временная метка вне границ». Чтобы решить эту проблему, я добавляю аргумент «errors = coerce», а затем пытаюсь удалить все NA, которые возникают. Например:

pd.to_datetime(df[date_features], infer_datetime_format = True, errors = 'coerce')
df[date_features].dropna(inplace= True)

Тем не менее, похоже, что это не преобразует функции в «datetime:» («maturity_date» - одна из date_features, которую я пытаюсь преобразовать в datetime).

df.[maturity_date].describe()

count        3355323
unique         11954
top       2015-12-01
freq           29607
Name: maturity_date, dtype: object

Кроме того, если я снова попытаюсь преобразовать зрелость_дату с помощью pd.to_datetime без «принуждения», я получу временную метку «Вне границ».

Надеюсь подробно описал эту проблему.

есть идеи?


person GPB    schedule 18.12.2017    source источник
comment
pd.to_datetime не является операцией на месте. Присвойте результат обратно.   -  person cs95    schedule 18.12.2017
comment
Кроме того, вызов dropna для столбца ничего не делает. Если вы хотите удалить нулевые строки, используйте df = df.dropna(subset=['date_features'])   -  person cs95    schedule 18.12.2017
comment
Попробуйте внедрить эти изменения в свой код и дайте мне знать, если они сработают.   -  person cs95    schedule 18.12.2017
comment
По-прежнему помечает функции как объект dtype.   -  person GPB    schedule 18.12.2017
comment
@COLDSPEED - См. модификацию вопроса выше...   -  person GPB    schedule 18.12.2017
comment
Хм... это было решено отлично. describe возвращает новую серию, а dtype описывает эту серию, а не maturity_date каким-либо образом.   -  person cs95    schedule 18.12.2017
comment
Я откатил ваше редактирование и преобразовал свои комментарии в ответ, так как они, очевидно, сработали для вас.   -  person cs95    schedule 18.12.2017


Ответы (1)


pd.to_datetime не является операцией на месте. Ваш код выполняет преобразование и отбрасывает результат. Правильно было бы присвоить результат обратно, например:

df['date_features'] = pd.to_datetime(df.date_features, errors='coerce')

Кроме того, не вызывайте dropna для столбца, принадлежащего фрейму данных, так как это не изменит фрейм данных (даже с inplace=True). Вместо этого вызовите dropna для dataframe с атрибутом subset

df.dropna(subset='date_features', inplace=True)

Теперь, как было замечено, maturity_date будет выглядеть так:

results["maturity_date"].head()

0   2017-04-01
1   2017-04-01
2   2017-04-01
3   2016-01-15
4   2016-01-15
Name: maturity_date, dtype: datetime64[ns]

Как видите, dtype равно datetime64, то есть эта операция сработала. Если вы вызываете describe(), он выполняет несколько стандартных агрегаций и возвращает результаты в виде новой серии. Эта серия отображается так же, как и любая другая, включая dtype описание, которое относится к онам, а не к описываемому столбцу.

person cs95    schedule 18.12.2017
comment
@COLDSPEED - вау, я многому научился из твоего ответа - я никогда не понимал, что описание работает так, как ты сказал. Большое тебе спасибо. - person GPB; 19.12.2017