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.datetime
valores y None
valores (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 object
columna 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 datetime
muchas 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 object
tipo, 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 datetime
valores, sino que también podría contener None
, y posiblemente algunos valores no válidos (mencionando ya que de otra una pd.to_datetime
en un try
/ except
cláusula harían)? Algo así como una versión flexible depd.to_datetime(col)
datetime.datetime
opandas._libs.tslibs.timestamps.Timestamp
? Si lo primero, mi recomendación sería cambiar lo que haya creado la fecha y hora al tipo que sepandas
maneje un poco mejor.None
en sus columnas,None
representativos reales o de cadena?None
, no una cadena. Potencialmente puede haber valores erróneos también ... @erfandatetime
yvalues
en 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_datetime
ycoerce
los 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.parser
usará 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
dateutil
módulo mencionado por @Serge parece que podría ser útil.dateutil.parse
identificar muchos tipos diferentes de cadenas de fecha.