¿como convertir en python 3 los datos provenientes de un archivo CSV?

publicado por: Anonymous

Estoy trabajando en Python 3, al leer un archivo .CSV con varias columnas, de las cuales las 3 ultimas tienen números. Al leer el archivo, todas las columnas las lee como strings y yo deseo que tengan formato int o float.

¿Cómo puedo convertir las columnas 5, 6 y 7 a números enteros o flotantes?

Gracias

mi código es el siguiente:

dato_produc = 'produccion_diaria2.csv' #nombre del archivo a leer
 with open (dato_produc, 'r') as produccion:
      produccion = produccion.read().splitlines() #divide los registros en lineas

datos_produccion = []
for l in produccion:
    line = l.split(',') # separa cada dato con una coma
    datos_produccion.append([line[1], line[2], line[3], line[4], line[5], line[6], line[7], line[8]]) #Crea una lista con los datos obtenidos del archivo CSV
 datos_produccion.remove(['indice_planta', 'fecha', 'linea', 'turno', 'supervisor', 'lbs_totales', 'IngUtil', 'merma']) # elimina la primera fila que contiene los titulos para poder hacer operaciones aritmeticas
 print (datos_produccion) # imprime la lista que se ha creado.

solución

El casting se hace tal y como te muestra Patricio Moracho en su respuesta, no obstante, si tienes libertad para usar cualquier librería y vas a operar con los datos te recomiendo que consideres el uso de Pandas. Lo puedes instalar usando pip y aparte de facilitarte mucho las cosas tendrás una gran diferencia en cuanto a eficiencia y posibilidades.

Un ejemplo de produccion_diaria2.csv:

indice_planta,fecha,linea,turno,supervisor,lbs_totales,IngUtil,merma
2,2017/04/01,1,4,A,1524,45,14
1,2017/05/01,1,5,B,147,75,12
1,2017/05/21,1,4,C,1478,41,14
2,2017/05/14,1,4,A,1457,41,5
2,2017/05/04,2,4,D,1475,14,2

Cargamos el csv en un DataFrame:

import pandas as pd

df = pd.read_csv("produccion_diaria2.csv",  parse_dates=['fecha'])

Los datos son convertidos al tipo adecuado según su compatibilidad de forma automática, aunque también podemos indicarlo de forma explícita. Especificamos que se parsee la fecha de forma explícita a tipo datetime.

Podemos ver nuestra tabla:

>>> df
   indice_planta      fecha  linea  turno supervisor  lbs_totales  IngUtil  merma
0              2 2017-04-01      1      4          A         1524       45     14
1              1 2017-05-01      1      5          B          147       75     12
2              1 2017-05-21      1      4          C         1478       41     14
3              2 2017-06-14      1      4          A         1457       41      5
4              2 2017-06-04      2      4          D         1475       14      4

Ahora podemos usar todas las herramientas que Pandas pone a nuestra disposición para operar, filtrar y agrupar datos. Unos ejemplos muy básicos:

Seleccionamos solo las filas que sean de Mayo del 2017:

>>> df1 = df[(df["fecha"].dt.year == 2017) & (df["fecha"].dt.month == 5)]
>>> df1

   indice_planta      fecha  linea  turno supervisor  lbs_totales  IngUtil  merma
1              1 2017-05-01      1      5          B          147       75     12 
2              1 2017-05-21      1      4          C         1478       41     14

Seleccionamos las filas que tienen indice_planta con valor 2 y supervisor “A”:

>>> df2 = df[(df["indice_planta"] == 2) & (df["supervisor"] == "A")]
>>> df2

   indice_planta      fecha  linea  turno supervisor  lbs_totales  IngUtil  merma
0              2 2017-04-01      1      4          A         1524       45     14
3              2 2017-06-14      1      4          A         1457       41      5

Obtener la suma de la columna merma para la planta 1:

>>> df[df["indice_planta"] == 1]["merma"].sum()
26

Obtener una nueva columna resultado de restar merma a lbs_totales:

>>> df["lbs_reales"] = df["lbs_totales"] - df["merma"]
>>> df

   indice_planta      fecha  linea  turno supervisor  lbs_totales  IngUtil  merma  lbs_reales
0              2 2017-04-01      1      4          A         1524       45     14        1510  
1              1 2017-05-01      1      5          B          147       75     12         135 
2              1 2017-05-21      1      4          C         1478       41     14        1464
3              2 2017-06-14      1      4          A         1457       41      5        1452 
4              2 2017-06-04      2      4          D         1475       14      2        1473
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *