У меня огромный массив данных со многими столбцами, многие из которых имеют тип datetime.datetime
. Проблема в том, что многие из них также имеют смешанные типы, в том числе, например, datetime.datetime
значения и None
значения (и, возможно, другие недопустимые значения):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
Следовательно, приводя к object
столбцу типа. Это можно решить с помощью df.colx.fillna(pd.NaT)
. Проблема в том, что датафрейм слишком велик для поиска отдельных столбцов.
Другой подход заключается в использовании pd.to_datetime(col, errors='coerce')
, однако это приведёт ко datetime
многим столбцам, которые содержат числовые значения.
Я мог бы также сделать df.fillna(float('nan'), inplace=True)
, хотя столбцы, содержащие даты, все object
еще имеют тип, и все еще будут иметь ту же проблему.
Какой подход я мог бы использовать для приведения к datetime тех столбцов, значения которых действительно содержат datetime
значения, но также могут содержать None
и, возможно, некоторые недопустимые значения (упомяну, так как в противном случае в выражении a pd.to_datetime
в выражении try
/ except
)? Что-то вроде гибкой версииpd.to_datetime(col)
datetime.datetime
илиpandas._libs.tslibs.timestamps.Timestamp
? В первом случае я бы рекомендовал изменить созданный тип datetime на тип, которыйpandas
лучше обрабатывает.None
в ваших столбцах фактическиеNone
или строковые представители этого?None
не строки. Потенциально могут быть неправильные значения также ... @erfandatetime
иvalues
в нем?Ответы:
Основная проблема, которую я вижу, заключается в разборе числовых значений.
Я бы предложил сначала преобразовать их в строки
Настроить
Решение
источник
pd.to_datetime
иcoerce
ошибок, так как их много. Проблема была с числовыми столбцами. Но мне не пришло в голову, что числовые столбцы, приведенные к строке, не анализируются пандами »to_datetime
. Большое спасибо, это действительно помогает!Эта функция устанавливает тип данных столбца в datetime, если какое-либо значение в столбце соответствует шаблону регулярного выражения (\ d {4} - \ d {2} - \ d {2}) + (например, 2019-01-01 ). Отдайте должное этому ответу о том, как искать строку во всех столбцах Pandas DataFrame и фильтровать, что помогало с настройкой и применением маски.
Работая с предложением использовать
dateutil
, это может помочь. Он все еще работает, исходя из предположения, что если в столбце есть какие-либо значения типа даты, то столбец должен быть датой-временем. Я попытался рассмотреть различные методы итераций для фреймов данных, которые быстрее. Я думаю, что этот ответ о том, как перебирать строки в DataFrame в Pandas , хорошо их описал.Обратите внимание, что
dateutil.parser
будет использоваться текущий день или год для любых строк, таких как «декабрь» или «ноябрь 2019» без значений года или дня.Если вы также хотите использовать значения datatime from
dateutil.parser
, вы можете добавить это:источник
dateutil
модуль, упомянутый @Serge, выглядит очень полезным.dateutil.parse
чтобы идентифицировать много различных типов строк даты.