type dtypes data column change python date types dataframe pandas

python - dtypes - ¿Pueden los pandas reconocer automáticamente las fechas?



pandas dataframe (6)

Hoy me sorprendió positivamente el hecho de que, al leer datos de un archivo de datos (por ejemplo), los pandas puedan reconocer tipos de valores:

df = pandas.read_csv(''test.dat'', delimiter=r"/s+", names=[''col1'',''col2'',''col3''])

Por ejemplo, se puede verificar de esta manera:

for i, r in df.iterrows(): print type(r[''col1'']), type(r[''col2'']), type(r[''col3''])

En particular, entero, los flotantes y las cadenas se reconocieron correctamente. Sin embargo, tengo una columna que tiene fechas en el siguiente formato: 2013-6-4 . Estas fechas se reconocieron como cadenas (no como objetos de fecha Python). ¿Hay alguna forma de "aprender" pandas en fechas reconocidas?


Al fusionar dos columnas en una única columna de fecha y hora, la respuesta aceptada genera un error (pandas versión 0.20.3), ya que las columnas se envían a la función date_parser por separado.

Los siguientes trabajos:

def dateparse(d,t): dt = d + " " + t return pd.datetime.strptime(dt, ''%d/%m/%Y %H:%M:%S'') df = pd.read_csv(infile, parse_dates={''datetime'': [''date'', ''time'']}, date_parser=dateparse)


Debería agregar parse_dates=True o parse_dates=[''column name''] al leer, por lo general es suficiente para analizarlo mágicamente. Pero siempre hay formatos extraños que deben definirse manualmente. En tal caso, también puede agregar una función de analizador de fecha, que es la forma más flexible posible.

Supongamos que tiene una columna ''datetime'' con su cadena, luego:

dateparse = lambda x: pd.datetime.strptime(x, ''%Y-%m-%d %H:%M:%S'') df = pd.read_csv(infile, parse_dates=[''datetime''], date_parser=dateparse)

De esta manera, incluso puede combinar varias columnas en una sola columna de fecha y hora, esto combina una columna ''fecha'' y una columna ''hora'' en una única columna ''fecha y hora'':

dateparse = lambda x: pd.datetime.strptime(x, ''%Y-%m-%d %H:%M:%S'') df = pd.read_csv(infile, parse_dates={''datetime'': [''date'', ''time'']}, date_parser=dateparse)


El método pandas read_csv es ideal para analizar las fechas. Complete la documentación en http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

incluso puede tener las diferentes partes de fecha en diferentes columnas y pasar el parámetro:

parse_dates : boolean, list of ints or names, list of lists, or dict If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date column. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’

La detección de fechas predeterminada funciona muy bien, pero parece estar sesgada hacia los formatos de fecha norteamericanos. Si vives en otra parte, es posible que los resultados te atrapen de vez en cuando. Por lo que puedo recordar 1/6/2000 significa el 6 de enero en los Estados Unidos en lugar del 1 de junio donde vivo. Es lo suficientemente inteligente como para cambiarlos si se usan fechas como 23/6/2000. Sin embargo, probablemente sea más seguro quedarse con las variaciones de fecha AAAAMMDD. Disculpas a los desarrolladores de pandas, pero no lo he probado con fechas locales recientemente.

puede usar el parámetro date_parser para pasar una función y convertir su formato.

date_parser : function Function to use for converting a sequence of string columns to an array of datetime instances. The default uses dateutil.parser.parser to do the conversion.


Puede usar pandas.to_datetime() como se recomienda en la documentación para pandas.pydata.org/pandas-docs/stable/generated/… :

Si una columna o un índice contiene una fecha inutilizable, toda la columna o índice se devolverá sin modificaciones como un tipo de datos de objeto. Para el análisis de fecha y hora no estándar, use pd.to_datetime después de pd.read_csv .

Manifestación:

>>> D = {''date'': ''2013-6-4''} >>> df = pd.DataFrame(D, index=[0]) >>> df date 0 2013-6-4 >>> df.dtypes date object dtype: object >>> df[''date''] = pd.to_datetime(df.date, format=''%Y-%m-%d'') >>> df date 0 2013-06-04 >>> df.dtypes date datetime64[ns] dtype: object


Sí, según la documentation pandas.read_csv :

Nota: existe una ruta rápida para las iso8601-formatted .

Entonces, si su csv tiene una columna llamada datetime y las fechas se ven como 2013-01-01T01:01 por ejemplo, ejecutar esto hará que los pandas (estoy en v0.19.2) seleccionen la fecha y la hora automáticamente:

df = pd.read_csv(''test.csv'', parse_dates=[''datetime''])

Tenga en cuenta que necesita pasar explícitamente parse_dates , no funciona sin.

Verificar con:

df.dtypes

Debería ver que el tipo de datos de la columna es datetime64[ns]


Tal vez la interfaz de los pandas ha cambiado desde @Rutger respondió, pero en la versión que estoy usando (0.15.2), la función date_parser recibe una lista de fechas en lugar de un solo valor. En este caso, su código debe actualizarse así:

dateparse = lambda dates: [pd.datetime.strptime(d, ''%Y-%m-%d %H:%M:%S'') for d in dates] df = pd.read_csv(infile, parse_dates=[''datetime''], date_parser=dateparse)