Necesita hacer una operación matemática en cada línea en varios archivos CSV en Python

StackOverflow https://stackoverflow.com/questions/7350851

  •  28-10-2019
  •  | 
  •  

Pregunta

Tengo alrededor de 100 archivos CSV en los que tengo que operar una vez al mes y estaba tratando de envolver mi cabeza, pero me estoy encontrando con una pared. Estoy empezando a entender algunas cosas sobre Python, pero combinar varias cosas todavía me está dando problemas, por lo que no puedo resolver esto.

Aquí está mi problema:

Tengo muchos archivos CSV, y esto es lo que necesito hacer:

Agregue una "columna" al frente de cada fila (o en la parte posterior, no importa realmente, pero el frente es ideal). Además, cada línea tiene 5 filas (sin contar el nombre de archivo que se agregará), y aquí está el formato:

Número de identificación de 6 dígitos, aaa yyyy-mm-dd (1), yyyy-mm-dd (2), aaa yyyy-mm-dd (3), número de 1-2 dígitos

Necesito restar YYYY-MM-DD (3) de YYYY-MM-DD (2) para cada línea en el archivo (no hay fila de encabezado), para cada CSV en un directorio determinado.

Necesito el nombre de archivo dentro de la fila porque combinaré los archivos (que, si se incluye en el script, sería increíble, pero creo que puedo resolver esa parte), y necesito saber de qué archivo provienen los registros. El formato del nombre de archivo es siempre '4-5 dígitos-number.csv'

Espero que esto tenga sentido, si no es así, hágamelo saber. Estoy un poco perplejo en cuanto a dónde comenzar, por lo que no tengo ningún código de muestra que incluso realmente comenzara a funcionar para mí. Realmente frustrado, así que agradezco cualquier ayuda que puedan proporcionar, ¡este sitio rockea!

Mylan

¿Fue útil?

Solución

Hay una herramienta en la biblioteca estándar para cada una de estas tareas:

Para iterar sobre todos los archivos CSV en un directorio, use el glob módulo:

import glob
for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
    #do_something

Para analizar un archivo CSV, use el csv módulo:

import csv
with open(csvfilename, "rb") as csvfile:
    reader = csv.reader(csvfile, delimiter=",")
    for row in reader:
        # row is a list of all the entries in the current row

Para analizar una fecha y calcular una diferencia, use el datetime módulo:

from datetime import datetime
startdate = datetime.strptime("1999-10-20", "%Y-%m-%d")
enddate = datetime.strptime("2003-02-28", "%Y-%m-%d")
delta = enddate - startdate # difference in days

Para agregar un valor al comienzo de una fila:

row[0:0] = [str(delta)]

Para agregar el nombre de archivo al final de una fila:

row.append(csvfilename)

Y para escribir una fila en un nuevo archivo CSV:

with open(csvfilename, "wb") as csvfile:
    writer = csv.writer(csvfile, delimiter=",")
    writer.writerow(row)

Tomados todos juntos, obtienes:

import glob
import csv
from datetime import datetime

with open("combined_files_csv", "wb") as outfile:
    writer = csv.writer(outfile, delimiter=",")
    for csvfilename in glob.glob(r"C:\mydirectory\*.csv"):
        with open(csvfilename, "rb") as infile:
            reader = csv.reader(infile, delimiter=",")
            for row in reader:
                startdate = datetime.strptime(row[3], "%Y-%m-%d")
                enddate = datetime.strptime(row[2], "%Y-%m-%d")
                delta = enddate - startdate # difference in days
                row[0:0] = [str(delta)]
                row.append(csvfilename)
                writer.writerow(row)

Otros consejos

El esquema básico del programa será así:

  1. Use el módulo OS para sacar los nombres de archivo del directorio/directorios de interés
  2. Leer en cada archivo uno a la vez
  3. Para cada línea en el archivo, divídalo en columnas con columns = line.split(",")
  4. Use Datetime.date para convertir cadenas como "2011-05-03" en DateTime.dates.
  5. Resta la tercera fecha de la segunda, que produce una fecha y hora. Trimedelta.
  6. Coloque toda su información en el formato que desee (Sugerencia: STR (FOO) produce una representación de cadena de Foo, para casi cualquier tipo) y recuerde para más tarde
  7. Cierre su archivo, vuelva a abrirlo para escribir y escriba sus nuevas cosas en
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top