Tengo un gran marco de datos con muchas columnas, muchas de las cuales son de tipo datetime.datetime. El problema es que muchos también tienen tipos mixtos, que incluyen, por ejemplo, datetime.datetimevalores y Nonevalores (y potencialmente otros valores no válidos):
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
Por lo tanto, resulta en una objectcolumna de tipo. Esto se puede resolver con df.colx.fillna(pd.NaT). El problema es que el marco de datos es demasiado grande para buscar columnas individuales.
Otro enfoque es usar pd.to_datetime(col, errors='coerce'), sin embargo, esto se convertirá en datetimemuchas columnas que contienen valores numéricos.
También podría hacerlo df.fillna(float('nan'), inplace=True), aunque las columnas que contienen fechas todavía son de objecttipo, y todavía tendrían el mismo problema.
¿Qué enfoque podría seguir al elenco de fecha y hora a las columnas cuyos valores realmente no contener datetimevalores, sino que también podría contener None, y posiblemente algunos valores no válidos (mencionando ya que de otra una pd.to_datetimeen un try/ exceptcláusula harían)? Algo así como una versión flexible depd.to_datetime(col)

datetime.datetimeopandas._libs.tslibs.timestamps.Timestamp? Si lo primero, mi recomendación sería cambiar lo que haya creado la fecha y hora al tipo que sepandasmaneje un poco mejor.Noneen sus columnas,Nonerepresentativos reales o de cadena?None, no una cadena. Potencialmente puede haber valores erróneos también ... @erfandatetimeyvaluesen ella?Respuestas:
El principal problema que veo es al analizar valores numéricos.
Propondría convertirlos a cadenas primero
Preparar
Solución
fuente
pd.to_datetimeycoercelos errores, ya que hay muchos. El problema fue con las columnas numéricas. Pero no se me ocurrió que las columnas numéricas convertidas en cuerdas no sean analizadas por los pandas 'to_datetime. Muchas gracias, esto realmente ayuda!Esta función establecerá el tipo de datos de una columna en fecha y hora, si algún valor en la columna coincide con el patrón de expresiones regulares (\ d {4} - \ d {2} - \ d {2}) + (por ejemplo, 2019-01-01 ) Agradezca esta respuesta sobre cómo buscar cadenas en todas las columnas y filtros Pandas DataFrame que ayudaron a configurar y aplicar la máscara.
A partir de la sugerencia de uso
dateutil, esto puede ayudar. Todavía está funcionando bajo la presunción de que si hay valores similares a una fecha en una columna, la columna debe ser una fecha y hora. Traté de considerar diferentes métodos de iteraciones de marcos de datos que son más rápidos. Creo que esta respuesta sobre Cómo iterar sobre filas en un DataFrame en Pandas hizo un buen trabajo al describirlos.Tenga en cuenta que
dateutil.parserusará el día o año actual para cualquier cadena como 'Diciembre' o 'Noviembre de 2019' sin valores de año o día.En caso de que también desee utilizar los valores de datatime de
dateutil.parser, puede agregar esto:fuente
dateutilmódulo mencionado por @Serge parece que podría ser útil.dateutil.parseidentificar muchos tipos diferentes de cadenas de fecha.