Hoy me sorprendió positivamente el hecho de que, al leer datos de un archivo de datos (por ejemplo), los pandas pueden 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, los números 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 de Python). ¿Hay alguna manera de "aprender" pandas a fechas reconocidas?
df.iterrows()
y verlos para cada fila, solo hágalodf.info()
una vez.Respuestas:
Debe agregar
parse_dates=True
, oparse_dates=['column name']
al leer, eso suele ser 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, entonces:
De esta manera, incluso puede combinar varias columnas en una sola columna de fecha y hora, esto combina una columna de "fecha" y una de "hora" en una sola columna de "fecha y hora":
Puede encontrar directivas (es decir, las letras que se utilizarán para diferentes formatos) para
strptime
ystrftime
en esta página .fuente
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: "los pandas intentarán inferir el formato de las cadenas de fecha y hora en las columnas". Esto se puede usar en lugar dedate_parser
.ISO 8601
formato, no debe pasarinfer_datetime_format
ni una función de analizador: es mucho más lento que dejar que los pandas lo manejen (especialmente el último). El formato de fecha en esta respuesta también seQuizás la interfaz de pandas ha cambiado desde que respondió @Rutger, pero en la versión que estoy usando (0.15.2), la
date_parser
función recibe una lista de fechas en lugar de un solo valor. En este caso, su código debe actualizarse así:fuente
El método pandas read_csv es ideal para analizar fechas. Documentación completa 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:
La detección predeterminada de fechas funciona muy bien, pero parece estar sesgada hacia los formatos de fecha norteamericanos. Si vives en otro lugar, los resultados podrían atraparte ocasionalmente. Hasta donde puedo recordar 1/6/2000 significa 6 de enero en los Estados Unidos en lugar de 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 permanecer con variaciones de fecha AAAAMMDD. Disculpas a los desarrolladores de pandas, aquí, pero no lo he probado con fechas locales recientemente.
puede usar el parámetro date_parser para pasar una función para convertir su formato.
fuente
dayfirst
como Verdadero para fechas europeas / internacionales. pandas.pydata.org/pandas-docs/stable/generated/…Puede usar
pandas.to_datetime()
como se recomienda en la documentación parapandas.read_csv()
:Manifestación:
fuente
Al fusionar dos columnas en una sola 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:
fuente
Sí, de acuerdo con la
pandas.read_csv
documentación :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) recojan 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 él.Verificar con:
df.dtypes
Debería ver que el tipo de datos de la columna es
datetime64[ns]
fuente
Si el rendimiento es importante para usted, asegúrese de tener tiempo:
huellas dactilares:
Así que con ISO8601 con formato de fecha (
%Y-%m-%d %H:%M:%S
que aparentemente es una fecha ISO8601-formateado, supongo que la T se puede quitar y sustituir por un espacio) se debe no especificarinfer_datetime_format
(que no hace una diferencia con los más comunes, ya sea en apariencia) y pasando su propio analizador en solo paraliza el rendimiento. Por otro lado,date_parser
hace una diferencia con formatos de día no tan estándar. Asegúrese de tomar el tiempo antes de optimizar, como de costumbre.fuente
Al cargar el archivo csv contiene la columna de fecha. Tenemos dos enfoques para hacer pandas para reconocer la columna de fecha, es decir
Los pandas reconocen explícitamente el formato por arg
date_parser=mydateparser
Pandas implícitamente reconoce el formato por agr
infer_datetime_format=True
Algunos de los datos de la columna de fecha
01/01/18
01/02/18
Aquí no sabemos las dos primeras cosas Puede ser mes o día. Entonces, en este caso tenemos que usar el Método 1: - Pase explícitamente el formato
Método 2: - implícito o reconoce automáticamente el formato
fuente