È necessario eseguire un'operazione matematica su ogni riga in diversi file CSV in Python

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

  •  28-10-2019
  •  | 
  •  

Domanda

Ho circa 100 file CSV con cui devo operare una volta al mese e stavo cercando di avvolgere la testa su questo, ma mi imbatto in un muro. Sto iniziando a capire alcune cose su Python, ma combinare diverse cose mi dà ancora problemi, quindi non riesco a capirlo.

Ecco il mio problema:

Ho molti file CSV, ed ecco cosa ho bisogno di fare:

Aggiungi una "colonna" alla parte anteriore di ogni riga (o sul retro, non importa davvero, ma la parte anteriore è l'ideale). Inoltre, ogni riga ha 5 righe (senza contare il nome file che verrà aggiunto) ed ecco il formato:

Numero ID a 6 cifre, YYYY-MM-DD (1), YYYY-MM-DD (2), YYYY-MM-DD (3), numero 1-2 cifre

Devo sottrarre Yyyy-MM-DD (3) da YYYY-MM-DD (2) per ogni riga del file (non esiste una riga di intestazione), per ogni CSV in una determinata directory.

Ho bisogno del nome file all'interno della riga perché combinerò i file (che, se è incluso nello script, sarebbe fantastico, ma penso di poter capire quella parte) e ho bisogno di sapere da quale file provengono i record. Il formato del nome file è sempre '4-5-digit-number.csv'

Spero che questo abbia senso, se non lo fa, per favore fatemelo sapere. Sono un po 'sconcertato da dove iniziare, quindi non ho alcun codice di esempio che ha anche iniziato a lavorare per me. Davvero frustrato, quindi apprezzo qualsiasi aiuto che voi ragazzi potete fornire, questo sito rock!

Mylan

È stato utile?

Soluzione

C'è uno strumento nella libreria standard per ciascuna di queste attività:

Per iterare su tutti i file CSV in una directory, utilizzare il glob modulo:

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

Per analizzare un file CSV, utilizzare il csv modulo:

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

Per analizzare una data e calcolare una differenza, usa il datetime modulo:

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

Per aggiungere un valore all'inizio di una riga:

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

Per aggiungere il nome file alla fine di una riga:

row.append(csvfilename)

E per scrivere una riga a un nuovo file CSV:

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

Preso tutti insieme, ottieni:

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)

Altri suggerimenti

Lo schema di base del programma sarà così:

  1. Utilizzare il modulo OS per ottenere i nomi di file fuori dalla directory/directory di interesse
  2. Leggi in ogni file alla volta
  3. Per ogni riga nel file, dividerlo in colonne con columns = line.split(",")
  4. Usa DateTime.Date per convertire stringhe come "2011-05-03" in datetime.dates.
  5. Sottrai la terza data dal secondo, che produce un datetime.timedelta.
  6. Metti tutte le tue informazioni nel formato che desideri (Suggerimento: STR (FOO) produce una rappresentazione di stringa di FOO, per qualsiasi tipo) e ricordalo per dopo
  7. Chiudi il tuo file, riaprilo per la scrittura e scrivi le tue nuove cose
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top