Für Loop über mehrere Ordner, um die Datetime in mehreren CSV-Dateien zu wiederholen und mit dem Dateinamen automatisch generiert zu exportieren

Ich habe viele Dataframes (csv-Dateien) in verschiedenen Ordnern in meinen Dokumenten auf meinem Computer. Alle csv-Dateien haben die gleiche Anzahl von Spalten, wobei der Name jeder Spalte gleich ist und in der gleichen Reihenfolge, jedoch variieren die Anzahl der Datenzeilen in den Dateien. Alle Dateien haben "Datetime" als ihre erste Spalte, wobei "YYYYMMDD HH: MM: SS" in den Datenzeilen aufgezeichnet wird.

Ich möchte alle Dataframes wiederholen, um stündliche, tägliche und monatliche Daten aus den Originaldateien zu erstellen. Einige Spalten innerhalb der csv-Dateien erfordern die Daten, die über die Stunde, Tag und Monat summiert werden sollen, während andere Spalten die Datenwerte über diese Zeitrahmen (konsistent über alle csv-Dateien) generieren müssen. Ich wünsche für jede Original-Csv-Datei eine stündliche, tägliche und monatliche Version von sich selbst.

Alle csv-Dateien existieren innerhalb des folgenden Eingabepfades, befinden sich aber tatsächlich in anderen Dateien innerhalb dieses Eingabepfades:

Inputpath = 'C: / Users / cp_vm / Dokumente / Daten / Eingabe / Sauber /'

Zum Beispiel, innerhalb des Ordners "Clean" gibt es zwei weitere Ordner und innerhalb dieser Ordner sind andere, die alle csv-Dateien enthalten. Ich möchte in allen csv-Dateien lesen, die vorbei am "Clean" -Ordner vorhanden sind, ohne mehrere 'inputpaths' schreiben und die Dateien wie oben erwähnt erneut ablesen zu müssen.

Ich möchte dann diese resampled Dataframes in die Ordner exportieren, aus denen sie kamen, und füge entweder "Stunde", "Tag" oder "Monat" zu ihren Namen hinzu.

Ein Snippet-Beispiel für die CSV-Dateien finden Sie weiter unten.

Bildbeschreibung hier eingeben

Zum Beispiel möchte ich die 15-Minuten-Intervalldaten zu stündlichen, täglichen und monatlichen Daten wiederholen. Die ersten beiden Spalten müssen summiert werden, wenn sie erneut abgetastet werden, während die dritte Spalte über den neu abgetasteten Zeitrahmen gemittelt werden muss. Ich verstehe, dass df.resample ('h') Summe () die Daten über die Stunde summiert und * .mean () die Daten über die Stunde durchschnittlich, aber es ist schwierig, wenn verschiedene Spalten unterschiedliche Resampling benötigen und dann wollen Kombinieren alle diese Spalten zusammen und exportieren dann die stündliche, tägliche oder monatliche Datei an den jeweiligen Ort, an dem der Dateiname automatisch geändert wurde, um zu zeigen, dass es jetzt stündlich, täglich oder monatlich ist.

Ich weiß, das ist ziemlich beschreibend, aber es verursacht mir alle möglichen Verzögerungen und die Verlagerung der csv-Dateien wird ein anderes Python-Skript beeinflussen, das ich bereits geschrieben habe. Irgendwelche Vorschläge würden sehr geschätzt. Vielen Dank im Voraus für jede Hilfe, die Sie zur Verfügung stellen können.

  • Parsing Textdatei mit JSON-artigem Objekt in CSV
  • Zählen von bestimmten Vorkommen in Python in csv-Datei
  • Wie bekomme ich einen CSV-Leser, um eine Speicherdatei zu lesen?
  • CSV-Spalten in einer anderen Reihenfolge in Python schreiben
  • Umgang mit zusätzlichen Newlines (Wagenrücklauf) in csv-Dateien, die mit Python geparkt wurden?
  • CParserError: Fehler beim Tokenisieren von Daten
  • One Solution collect form web for “Für Loop über mehrere Ordner, um die Datetime in mehreren CSV-Dateien zu wiederholen und mit dem Dateinamen automatisch generiert zu exportieren”

    Es ist schwer zu finden, wo dein Problem wirklich ist 🙂

    Aber python hat so etwas wie oswalk, lassen Sie mich Ihnen ein Beispiel geben:

    import os root_directory = '/home/xyz/some_root_dir/' def is_csv(fname): return fname.endswith('.csv') csv_files = [] for directory, subdirectories, files_names in os.walk(root_directory): for fname in files_names: if is_csv(fname): csv_files.append( { 'directory': directory, 'fname': fname } ) print(csv_files) 

    Und das in meinem Testfall:

     [ {'directory': '/home/xyz/some_root_dir', 'fname': 'my.csv'}, {'directory': '/home/xyz/some_root_dir/test2/test31', 'fname': 'myohter3.csv'} {'directory': '/home/xyz/some_root_dir/test2/test31', 'fname': 'myohter.csv'} ] 

    Dies wird sicherlich helfen Sie mit immer alle csv-Dateien – Sie können die is_csv-Methode für Ihre Bedürfnisse zu ändern. Ich bin nicht in der Lage, Ihnen mit aggregierenden Daten zu helfen 🙂

    Aber sobald du alle Daten gelesen hast, sollte es nicht viel ein Problem sein.

    Ok, jetzt beginnt der spaß Ich mache es sehr schnell – und vermutlich kann man besser schreiben, aber es ist guter Startpunkt, wir haben eine Dateiliste aus dem vorherigen Schritt, lassen Sie die nächsten Schritte:

     import csv import os from datetime import datetime data = {} # gather the data; for fdata in csv_files: with open(os.path.join(fdata['directory'], fdata['fname']), 'r') as f: reader = csv.reader(f, delimiter='|', quotechar='"') rows = list(reader) data[fdata['fname']] = rows # we can't store it per datetime here, because can lost data # ok we have a data now in format: # { # 'other3.csv': [ # ['Datetime', 'Egen1_NotCum_kWh', 'Egen2_NotCum_kWh', 'Egen3_NotCum_kWh'], # ['2016-09-04 13:45:00', '643.23', '649', '654'], # ['2016-09-04 14:00:00', '612.21', '672', '666'], # ['2016-09-04 14:15:00', '721.3', '719', '719'], # ['2016-09-04 14:30:00', '730', '721', '725'], # ['2016-09-04 14:45:00', '745', '725', '731']], # 'my.csv': ... # } # convert the string data to python Datetime DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" for fname, inner_data in data.iteritems(): for row in inner_data[1:]: # skip headers p_datetime = datetime.strptime(row[0], DATETIME_FORMAT) row[0] = p_datetime # now the aggregates; def get_all_rows_in_dates(start_date, end_date, data): headers = data[data.keys()[0]][0] data_rows = [] for fname, inner_data in data.iteritems(): for row in inner_data[1:]: # skip the header if start_date <= row[0] < end_date: data_rows.append(row) return headers, data_rows def aggregate_col_12(values): values = map(float, values) return sum(values) def aggregate_col_3(values): values = map(float, values) return sum(values) / float(len(values)) def count_aggregates(rows_in_dates, start_date): col1 = [] col2 = [] col3 = [] for row in rows_in_dates[1:]: # skip headers col1.append(row[1]) col2.append(row[2]) col3.append(row[3]) return [start_date.strftime(DATETIME_FORMAT), aggregate_col_12(col1), aggregate_col_12(col2), aggregate_col_3(col3)] def write_results(headers, aggregate, fname): data = [] data.append(headers) data.append(aggregate) with open(fname, 'w+') as f: writer = csv.writer(f, delimiter='|', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer.writerows(data) start_date = datetime(2016, 9, 4, 13, 0, 0) end_date = datetime(2016, 9, 4, 14, 0, 0) headers, to_aggregate = get_all_rows_in_dates( start_date, end_date, data) aggregates = count_aggregates(to_aggregate, start_date) write_results(headers, aggregates, 'from_{}_to_{}.csv'.format( start_date.strftime(DATETIME_FORMAT), end_date.strftime(DATETIME_FORMAT), )) 

    Achten Sie darauf, dass der Benutzer ein passendes Trennzeichen und Quotechar in Ihrem Code hat. Und das ist nur der Anfang – man kann es als Start – das tägliche Aggregat – nutzen, sollte mit diesem Code erreichbar sein, aber wenn man zB einen csv mit pro zweiter Reihe für eine Stunde wünscht – musst du ihn ein wenig wickeln.

    Wenn Sie irgendwelche Fragen haben – bitte tun Sie.

    Python ist die beste Programmiersprache der Welt.