CSV Datei bearbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

Einen schönen guten Morgen / Mittag / Abend / Nacht an alle die das hier lesen.

Ich versuche mich gerade am programmieren obwohl ich davon wirklich keine Ahnung habe und stehe vor folgendem Problem.

Ich habe mir per webscrapping Daten in eine CSV Datei geladen. In der CSV Datei sind die Daten aber leider in einer einzigen Zelle gelandet (Sprich in Zelle A1 steht jetzt sowas wie 'Apple, Microsoft, SAP, etc').
Ich möchte aber gerne, dass jedes Unternehmen in einer eigenen Zelle steht (Sprich A1=Apple, A2=Microsoft, A3=SAP, etc.).
Es muss doch eine möglichkeit geben, die Daten anhand der ',' irgendwie zu trennen.
Wie müsste denn ein entsprechender Programmcode dafür aussehen.

Hier sind die Codebrocken mit denen ich gerade arbeite:

import yfinance as yf
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from datetime import date
from datetime import timedelta
from pandas_datareader import data
from pandas_datareader._utils import RemoteDataError
import pandas as pd
import numpy as np
from operator import itemgetter
import matplotlib.pyplot as plt
import csv, json
import io
from lxml import html

companies_Dow_Jones=['NVDA','AAPL']#'MSFT','AMZN','WMT','V','UNH','HD','PG','JNJ','CRM','CVX','KO','MRK','CSCO','MCD','DIS','AXP','IBM','GS','CAT','VZ','AMGN','HON','NKE','BA','SHW','MMM','TRV']
tickers=yf.Tickers(companies_Dow_Jones)

heute=datetime.now().strftime('%Y-%m-%d')
t1=timedelta(days=1826)
t2=timedelta(days=1096)
t3=timedelta(days=366)
fuenfjahre=datetime.now()-t1
dreijahre=datetime.now()-t2
einjahr=datetime.now()-t3

tickers_hist5=tickers.history(start=fuenfjahre,end=heute,interval='1d')
tickers_hist3=tickers.history(start=dreijahre,end=heute,interval='1d')
tickers_hist1=tickers.history(start=einjahr,end=heute,interval='1d')

tickers_hist5.to_csv('e://Python//Analysetool//Testordner//Rohdaten.csv')


Meine Idee ist jetzt, dass ich die Daten aus den Rohdaten nehme und aufgeteilt und sortiert in eine seperate CSV-Datei schreibe. Ich habe aber keine Ahnung wie ich die Daten aus den einzelnen Zellen vernünftig aufgeteilt bekomme.

Über Hilfe würde ich mich sehr freuen.

Vielen Dank schonmal im voraus.
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

Zur konkretisierung meines Problems. Mit dem obigen Code speichere ich die Daten in einer CSV Datei. Dummerweise werden die Daten wie folgt gespeichert:

| A | B | C
1|a,b,c, | |
2|d,e,f | |
3|g,h,i | |

Ich möchte aber, dass diese Werte aus den jeweils ersten Zellen der ersten Spalte aufgeteilt werden, dass es wie folgt aussieht:

| A | B | C
1| a | b | c
2| d | e | f
3| g | h | i

Erstazweise könnte ich auch damit leben, wenn das Ergebniss so aussieht:

| A | B | C
1| a | d | g
2| b | e | h
3| c | f | i

Ich habe jetzt schon mehrere Tage rumprobiert und das ist der aktuelle Code der aber leider immernoch nicht funktioniert:

import csv

input_path = 'e://Python//Analysetool//Testordner//Rohdaten.csv'
output_path = 'e://Python//Analysetool//Testordner//Aufbereitet.csv'

with open(input_path, 'r') as infile:
reader = csv.reader(infile)
rows = list(reader)

bereinigte_werte = []

for row in rows:
neue_zeile = []
for zelle in row:
geteilte_werte = zelle.split(',')
neue_zeile.extend(geteilte_werte)
bereinigte_werte.append(neue_zeile)

for row in bereinigte_werte:
print(row)

with open(output_path, 'w', newline='') as outfile:
writer = csv.writer(outfile)
writer.writerow(bereinigte_werte)

Mit dem Code erhalte ich jedoch immer nur eine Kopie der ersten CSV Datei. Eine aufteilung funktioniert nicht. Wenn ich im letzten Schritt writer.writerows nutze werden die Werte zwar aufgeteilt aber alle untereinander weg in der ersten Spalte. Damit kann ich dann leider auch herzlich wenig anfangen. Über Lösungsvorschläge wäre ich sehr dankbar.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Gottimperator: Was genau heisst denn das Werte in einer Zelle stehen? Du öffnest die Datei in einer Tabellenkalkulation? Dann sag *der* Software, das CSV-Dateien *komma*getrennte Werte enthalten. Bei LibreOffice geht das, bei Excel hatte ich das letzte mal als ich das versucht habe, arge Probleme. Oder Du verwendest beim speichern keine Kommas sondern das was (deutsches) Excel haben will. Kann man ja alles angeben, sowohl bei Pandas als auch beim `csv`-Modul.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Wenn die Ausgangsdaten

| A | B | C
1|a,b,c, | |
2|d,e,f | |
3|g,h,i | |

sind, dann ist da ja schon was kaputt, weil in der CSV-Datei | und , als Trenner vorkommen. Bzw. es ist vermutlich vorher beim DataFrame von Pandas schon was kaputt, weil scheinbar alle pro Reihe Daten in einer Zelle stehen... Da müsstet du mal ansetzen. Da wir nicht wissen, wie dein DataFrame, aus dem die CSV-Daten generiert werden, aussehen, kann man da z.Zt. leider mehr nicht sagen.

@_blackjack__: Excel 365 hat einen Import-Dialog für CSV Datei, da kann man Trenner und Zeichenkodierung der Datei einstellen. Was bei Excel nicht geht ist, beim Import den Datentyp pro Spalte selber festzulegen. Was LO AFAIK kann. Excel bietet an, den Datentyp automatisch zu bestimmen - oder eben nicht. Optional kann man die Daten nach als Zwischenschritt an Power Query schicken. Keine Ahnung, was da möglich ist.

Gruß, noisefloor
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

__blackjack__ hat geschrieben: Mittwoch 15. Januar 2025, 18:25 @Gottimperator: Was genau heisst denn das Werte in einer Zelle stehen? Du öffnest die Datei in einer Tabellenkalkulation? Dann sag *der* Software, das CSV-Dateien *komma*getrennte Werte enthalten. Bei LibreOffice geht das, bei Excel hatte ich das letzte mal als ich das versucht habe, arge Probleme. Oder Du verwendest beim speichern keine Kommas sondern das was (deutsches) Excel haben will. Kann man ja alles angeben, sowohl bei Pandas als auch beim `csv`-Modul.
Also mein Programm aus dem ersten Post sorgt dafür, dass die Daten in einer CSV Datei gespeichert werden. Und die Daten werden halt in unterschiedliche Zeilen gespeichert aber jeweils immer nur in die erste Zelle. In A1 steht dann halt 50 mal close, in A2 stehen 50 verschiedene Firmen und in A3 50 mal ein Aktienkurs. Mit der CSV-Datei möchte ich weiter arbeiten aber damit das ordentlich funktioniert müssen diese Werte halt getrennt und in seperate Zellen geschrieben werden.
Ich habe auch schon versucht den Code beim Speichern abzuändern, damit direkt beim speichern eine Trennung stattfindet, aber da es sich hierbei um einen Ticker von yfinance handelt kriege ich bei den üblichen operatoren wie z.B. split() eine Fehlermeldung.
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

noisefloor hat geschrieben: Mittwoch 15. Januar 2025, 20:20 Wenn die Ausgangsdaten

| A | B | C
1|a,b,c, | |
2|d,e,f | |
3|g,h,i | |

sind, dann ist da ja schon was kaputt, weil in der CSV-Datei | und , als Trenner vorkommen. Bzw. es ist vermutlich vorher beim DataFrame von Pandas schon was kaputt, weil scheinbar alle pro Reihe Daten in einer Zelle stehen... Da müsstet du mal ansetzen. Da wir nicht wissen, wie dein DataFrame, aus dem die CSV-Daten generiert werden, aussehen, kann man da z.Zt. leider mehr nicht sagen.

@_blackjack__: Excel 365 hat einen Import-Dialog für CSV Datei, da kann man Trenner und Zeichenkodierung der Datei einstellen. Was bei Excel nicht geht ist, beim Import den Datentyp pro Spalte selber festzulegen. Was LO AFAIK kann. Excel bietet an, den Datentyp automatisch zu bestimmen - oder eben nicht. Optional kann man die Daten nach als Zwischenschritt an Power Query schicken. Keine Ahnung, was da möglich ist.

Gruß, noisefloor

Die | Striche habe ich nur zur besseren visualisierung genutzt um die jeweiligen Zellen zu begrenzen. Die Werte in den Zellen sind nur mit Kommatas getrennt. In meinem Ursprungspost steht der Code mit dem ich Finanzdaten von yfinance webscrappe. Diese werden dann in der ersten CSV-Datei gespeichert. Natürlich wäre es auch eine Möglichkeit bereits bei diesem speichern eine Trennung hinzukriegen, aber daran bin ich ebenfalls kläglich gescheitert. Daraufhin dachte ich mir, dass es ja nicht so schwer sein kann, Daten von einer CSV-Datei in eine andere CSV-Datei zu schreiben und die Werte während dieses Übertrags vernünftig zu trennen. Leider beisse ich mir daran jetzt auch schon seit geraumer Zeit die Zähne aus.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Gottimperator: CSV steht ursprünglich für „comma separated values“. Natürlich sind da die Werte per Komma getrennt. Und nicht in einer Zelle sondern die Zellen sind per Komma getrennt. Funktioniert in ”amerikanischen” Excel auch problemlos, aber wenn man ein ”deutsches” Excel verwendet, dann will das die Werte an Semikolons getrennt haben. Man auch Sinn, weil bei uns das Komma ja schon in den Zahlen als Dezimalbruchtrennzeichen verwendet wird. Also musst Du entweder dem Excel explizit sagen, dass es das Komma als Trennzeichen für Zellen verwenden soll, oder Du musst beim Speichern explizit sagen, dass das Semikolon als Trennzeichen verwendet werden soll. Alles machbar — Du musst es halt nur *tun*.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Die | Striche habe ich nur zur besseren visualisierung genutzt um die jeweiligen Zellen zu begrenzen.
Das ist: maximal verwirrend. Weil: es den von __blackjack__ genannten Gründen kann es sinnvoll sein, das Pipe-Zeichen | als Separator zu verwenden. Weil das halt in "normalem" Text und Zahlenwerten eigentlich nie vorkommt und man dann auch keine Problem mit dem Trennzeichen hat, wenn man ein CSV mit | als Separator irgendwo importiert.

Wenn du nicht die _realen_ Daten zeigst können wir dir auch schlecht helfen.

Gruß, noiseefloor
Benutzeravatar
Kebap
User
Beiträge: 772
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Also mein Programm aus dem ersten Post sorgt dafür, dass die Daten in einer CSV Datei gespeichert werden. Und die Daten werden halt in unterschiedliche Zeilen gespeichert aber jeweils immer nur in die erste Zelle.
Die CSV Datei kennt keine Zellen. Darin steht nur reiner Text.
Die Zellen kommen erst ins Spiel, wenn du diese Datei mit bspw. Excel öffnest.
Dann versucht Excel, die Daten möglichst passend auf Zellen zu verteilen, und scheitert manchmal eben dabei.
Versuch mal die Datei mit einem einfachen Texteditor zu öffnen. Dann siehst du, was wirklich drin steht. Kannst du ja mal zeigen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

RFC4180 nennt die einzelnen Werte eines Datensatzes („record“) Felder („fields“). Also kennt CSV schon so etwas wie Zellen. Es ist ja *strukturierter* Text. 🤓
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Kebap
User
Beiträge: 772
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Das ist schon richtig. Dennoch habe ich beruflich oft mit Leuten zu tun, die CSV ausschließlich per Excel bearbeiten. Die glauben dann, die Darstellung der Kommaseperierten Werte in Excel-Zellen ist die einzig mögliche Wahrheit. Den Trugschluss versuche ich hier aufzubrechen. Natürlich sind die Werte in CSV ebenfalls getrennt. Nur nicht unbedingt so, wie Excel das automagisch interpretiert.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

__blackjack__ hat geschrieben: Donnerstag 16. Januar 2025, 17:00 @Gottimperator: CSV steht ursprünglich für „comma separated values“. Natürlich sind da die Werte per Komma getrennt. Und nicht in einer Zelle sondern die Zellen sind per Komma getrennt. Funktioniert in ”amerikanischen” Excel auch problemlos, aber wenn man ein ”deutsches” Excel verwendet, dann will das die Werte an Semikolons getrennt haben. Man auch Sinn, weil bei uns das Komma ja schon in den Zahlen als Dezimalbruchtrennzeichen verwendet wird. Also musst Du entweder dem Excel explizit sagen, dass es das Komma als Trennzeichen für Zellen verwenden soll, oder Du musst beim Speichern explizit sagen, dass das Semikolon als Trennzeichen verwendet werden soll. Alles machbar — Du musst es halt nur *tun*.
Sorry aber das Begreife ich nicht ganz. Der erste Teil des Codes (erster Post) speichert mir die Werte in eine CSV Datei. Hierbei wird in A1 50 mal "close" geschrieben (die einzelnen "close" sind mit Kommatas getrennt). In A2 werden 50 unterschiedliche Tickersymbole geschrieben (ebenfalls innerhalb der Zelle mit Kommas getrennt). In A3 werden die 50 Schlusskurse am z.B. 01.01.2019 geschrieben welche ebenfalls mit Kommas getrennt sind usw..
Sprich die einzelnen Werte sind mit Kommatas getrennt aber die Trennung findet in der Zelle statt. Ich hätte aber gerne, dass in A1 nur das erste "close" steht. In B1 das zweite "close". In C1 das dritte "close" usw. Nach dem Schema sollen alle Zeilen aufbereitet werden.
Das versuche ich mit dem zweiten Teil meines Programms zu bewerkstelligen (zweiter Post). Das Ergebniss ist aber, dass ich entweder eine exakte Kopie der ersten CSV-Datei erhalte oder aber sämtliche 50 "close" aus A1 der ersten CSV Datei in die ersten 50 Zeilen der zweiten CSV Datei geschrieben werden. Darauf folgen dann die 50 Tickersymbole in den nächsten 50 Zeilen usw. . (Der Unterschied liegt hier bei writerow bzw. writerows). Ich bin also in der Lage die einzelnen Werte aufzuteilen aber nur innerhalb der ersten Spalte (A) und nicht wie gewünscht auf die ersten 50 Spalten.

Die Tatsache, dass mein Program in der Lage ist die 50 Werte aus A1 aufzuteilen und auf die Zellen A1 bis A50 zu schreiben zeigt doch, dass eine Trennung nach Kommas stattfindet oder sehe ich da irgendwas falsch?

Ich bitte meine Unwissenheit zu entschuldigen ich habe vom Programmieren halt keine Ahnung.
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

noisefloor hat geschrieben: Donnerstag 16. Januar 2025, 17:15
Die | Striche habe ich nur zur besseren visualisierung genutzt um die jeweiligen Zellen zu begrenzen.
Das ist: maximal verwirrend. Weil: es den von __blackjack__ genannten Gründen kann es sinnvoll sein, das Pipe-Zeichen | als Separator zu verwenden. Weil das halt in "normalem" Text und Zahlenwerten eigentlich nie vorkommt und man dann auch keine Problem mit dem Trennzeichen hat, wenn man ein CSV mit | als Separator irgendwo importiert.

Wenn du nicht die _realen_ Daten zeigst können wir dir auch schlecht helfen.

Gruß, noiseefloor
In dem Fall entschuldige ich mich für die Verwirrung. Ich würde hier ja die CSV Datei Anhängen, sehe hier aber keinen Button dafür.
Also es handelt sich um eine leere Excel-Datei die als CSV Datei abgespeichert wurde. Hier werden mittel webscrapping Werte reingeschrieben. Der einfachhalt halber verwende ich jetzt nur einzelne Buchstaben anstatt der tatsächlichen Werte. Jeder Buchstabe steht aber für einen bestimmten Wert z.B. ist a=16.234657. Die einzelnen Werte in jeder einzelnen nach dem webscrapping beschriebenen Zelle sind mit Kommas getrennt. Das sieht wie folgt aus:

A1= a,b,c, usw.
B1= leer (da steht nicht leer sondern in B1 ist nichts drin)
C1= leer (siehe Klammer zu B1)
A2= d,e,f, usw.
B2= leer (siehe Klammer zu B1)
C2= leer (siehe Klammer zu B1)
A3= g,h,i, usw.
B3= leer (siehe Klammer zu B1)
C3= leer (siehe Klammer zu B1)

Das Ergebniss soll aber wie folgt aussehen:
A1=a
B1=b
C1=c
A2=d
B2=e
C2=f
A3=g
B3=h
C3=i
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

Kebap hat geschrieben: Freitag 17. Januar 2025, 09:12
Also mein Programm aus dem ersten Post sorgt dafür, dass die Daten in einer CSV Datei gespeichert werden. Und die Daten werden halt in unterschiedliche Zeilen gespeichert aber jeweils immer nur in die erste Zelle.
Die CSV Datei kennt keine Zellen. Darin steht nur reiner Text.
Die Zellen kommen erst ins Spiel, wenn du diese Datei mit bspw. Excel öffnest.
Dann versucht Excel, die Daten möglichst passend auf Zellen zu verteilen, und scheitert manchmal eben dabei.
Versuch mal die Datei mit einem einfachen Texteditor zu öffnen. Dann siehst du, was wirklich drin steht. Kannst du ja mal zeigen.
Ich habe die CSV Datei mit Excel geöffnet und alle Werte stehen dort genauso drin wie in der CSV Datei (Sprich alle 50 Werte aus A1 der CSV Datei stehen auch in A1 wenn ich es mit Excel öffne). Ich habe die auch mit einem Editor geöffnet und auch dort stehen alle Werte drin. Sprich alle Werte sind da aber ich kriege die in keine vernünftige Tabellenform.

Wie kann ich hier denn was Anhängen dann könnte ich die Ausgabe des Editors wie gewünscht anhängen.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Gottimperator: Nochmal: CSV bedeutet ursprünglich „comma separated values“, also Werte die durch Kommas getrennt sind. Wenn Du nicht speziell was angibst, wird das halt genau so gespeichert. Das funktioniert solange jede Software die das dann weiterverarbeitet, an Kommas getrennte Werte erwartet und ausgibt wenn es CSV sein soll. Kommas fanden die Amis toll, weil sich damit bei denen auch Werte die Dezimalbrüche sind, prima trennen lassen. Das funktioniert in Deutschland (und anderen Ländern) wo Dezimalbrüche nicht mit einem Dezimalpunkt sondern mit einem Dezimalkomma geschrieben werden, offensichtlich nicht mehr, weil das Komma dann zwei verschiedene Bedeutungen hat und man nicht mehr sagen kann wo es als Trenner und wo es in einem Dezimalbruch verwendet wird.

Beispiel (”amerikanisch”) mit Komma als Feldtrenner:

Code: Alles auswählen

23.42,47.11
Wäre mit ”deutschen” Zahlen und Komma als Feldtrenner:

Code: Alles auswählen

23,42,47,11
Und damit nicht mehr unterscheidbar ob das nun vier ganze Zahlen sein sollen, oder zwei ganze Zahlen und ein Dezimalbruch, oder zwei Dezimalbrüche. Darum verwendet beispielsweise ”deutsches” Excel nicht an Kommas sondern an Semikolons:

Code: Alles auswählen

23,42;47,11
Und *Du* schreibst jetzt Daten mit Komma als Feldtrenner, und öffnest die dann offensichtlich mit einer Software die Semikolons als Feldtrenner erwartet. Wenn da kein Semikolon ist, dann gehört natürlich der gesamte Datensatz zur ersten Zelle.

Also musst Du die Daten entweder mit Semikolons als Feldtrenner schreiben, oder dem Programm mit dem Du die Daten weiterverarbeitest, explizit sagen, dass Kommas zum trennen benutzt werden sollen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Gottimperator
User
Beiträge: 9
Registriert: Samstag 11. Januar 2025, 16:08

__blackjack__ hat geschrieben: Samstag 18. Januar 2025, 12:48 @Gottimperator: Nochmal: CSV bedeutet ursprünglich „comma separated values“, also Werte die durch Kommas getrennt sind. Wenn Du nicht speziell was angibst, wird das halt genau so gespeichert. Das funktioniert solange jede Software die das dann weiterverarbeitet, an Kommas getrennte Werte erwartet und ausgibt wenn es CSV sein soll. Kommas fanden die Amis toll, weil sich damit bei denen auch Werte die Dezimalbrüche sind, prima trennen lassen. Das funktioniert in Deutschland (und anderen Ländern) wo Dezimalbrüche nicht mit einem Dezimalpunkt sondern mit einem Dezimalkomma geschrieben werden, offensichtlich nicht mehr, weil das Komma dann zwei verschiedene Bedeutungen hat und man nicht mehr sagen kann wo es als Trenner und wo es in einem Dezimalbruch verwendet wird.

Beispiel (”amerikanisch”) mit Komma als Feldtrenner:

Code: Alles auswählen

23.42,47.11
Wäre mit ”deutschen” Zahlen und Komma als Feldtrenner:

Code: Alles auswählen

23,42,47,11
Und damit nicht mehr unterscheidbar ob das nun vier ganze Zahlen sein sollen, oder zwei ganze Zahlen und ein Dezimalbruch, oder zwei Dezimalbrüche. Darum verwendet beispielsweise ”deutsches” Excel nicht an Kommas sondern an Semikolons:

Code: Alles auswählen

23,42;47,11
Und *Du* schreibst jetzt Daten mit Komma als Feldtrenner, und öffnest die dann offensichtlich mit einer Software die Semikolons als Feldtrenner erwartet. Wenn da kein Semikolon ist, dann gehört natürlich der gesamte Datensatz zur ersten Zelle.

Also musst Du die Daten entweder mit Semikolons als Feldtrenner schreiben, oder dem Programm mit dem Du die Daten weiterverarbeitest, explizit sagen, dass Kommas zum trennen benutzt werden sollen.
Also hier mal, was mit meinem ersten Programm in A1 gespeichert wird:

Price,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Close,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,Dividends,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,High,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Low,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Open,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Stock Splits,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume,Volume

In A2 wird das hier gespeichert:

Ticker,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT,AAPL,AMGN,AMZN,AXP,BA,CAT,CRM,CSCO,CVX,DIS,GS,HD,HON,IBM,JNJ,KO,MCD,MMM,MRK,MSFT,NKE,NVDA,PG,SHW,TRV,UNH,V,VZ,WMT

in A3:
Date,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

in A4:
2020-01-21 00:00:00+00:00,76.72727966308594,203.95867919921875,94.5999984741211,121.9924087524414,311.5165710449219,131.60470581054688,184.24093627929688,41.78105163574219,90.72381591796875,141.8081512451172,217.3983612060547,206.50750732421875,163.14878845214844,105.43896484375,129.93675231933594,48.961734771728516,188.0775604248047,122.54428100585938,73.66290283203125,159.25482177734375,98.73487854003906,6.172622203826904,111.44982147216797,189.09622192382812,126.06634521484375,279.2361755371094,200.09613037109375,45.451072692871094,35.746578216552734,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,77.32108332706851,207.74426584450367,94.7135009765625,123.19804156618515,324.66833324795715,133.42740069405718,184.9668773016973,42.12352058386525,92.19705027339258,142.82558106652132,220.18552781837164,207.13692015351685,165.28588200828693,105.5753412841642,130.72018020618017,49.03025022666656,189.05730844042245,124.26573618005479,74.48165440618436,160.87128446568866,98.83873106167066,6.206231358835837,111.91828940256168,190.75105558904744,126.63892616648562,281.1037675978858,201.15796148608752,45.56409872555108,35.77750306636635,76.58912661521823,203.6668091891608,93.0,121.86156631831282,303.94164432164825,131.4603298489472,180.4918722056885,41.669748737698306,90.61172272999984,141.26485981801113,217.30988808416149,204.83204448707045,162.734003443403,104.24948609625727,129.2664779737081,48.44788192768004,187.24031206854897,122.02511178718864,73.4500270299675,159.1878607927097,98.0079108886179,6.138514934919718,110.34495763771368,188.23215523557306,125.59217725417503,275.0364468884749,196.72725795298624,45.285301944772826,35.41567736877597,76.87754828501977,206.8515232032291,93.25,122.53447433976149,320.69199121267803,132.8228418443642,180.50181119880472,41.918038561786226,92.15701437399485,142.47986112024495,218.73443630792443,205.24869519236455,165.05142514671252,104.4085959741585,129.33611807425953,48.68767948596977,188.26459717369747,124.22474618387302,74.27696814924583,159.42698214672976,98.42332097514428,6.169385650604325,111.7326730875998,189.53942099458598,125.94109355827855,275.85409969827316,197.04580728748437,45.36065359134995,35.437326179294374,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,110843200,3094200,74156000,3102700,19318000,2476700,6302400,21771800,8470300,9250200,2492400,4873500,2188600,7577329,9543900,11968900,4100500,4027769,10022129,29517200,4854700,217916000,8553100,1596000,1604700,4962800,14861700,12857600,22061100

Sprich bei den Schlusskursen werden Punkte als Trenner verwendet und als Trennung zu dem neuen Wert Kommas.
So wie ich das sehe habe ich doch mit split(',') im zweiten Programmcode Kommas als Feldtrenner gesetzt oder sehe ich das jetzt falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In Deinem ersten Programm wird in ”A1” Price gespeichert und sonst nichts. In ”B1” wird Close gespeichert und sonst nichts. In Deinen Daten werden alle Felder durch Kommas getrennt. Keine durch Punkt. Der Punkt ist der *Dezimaltrenner* innerhalb einer Zahl. Also genau so wie das ursprünglich in CSV-Dateien vorgesehen ist. Computer sind was Amerikanisches. Mehr als ASCII braucht keiner. 😉

Und Du *öffnest* das dann in einer Software die Felder *nicht* an Kommas trennt, sondern eben sehr wahrscheinlich an Semikolons. Weil das bei ”deutschem” Excel so üblich ist, weil da das Komma ja schon für Dezimalbrüche verwendet wird.

Den Inhalt einer CSV-Datei kannst Du einfach in einem Codeblock in den Beitrag einfügen. Wenn die nicht zu lang ist. Ansonsten sinnvoll kürzen. Bis auf die Kodierung sollten dabei die relevanten Informationen erhalten bleiben.

Letztlich aber sehr wahrscheinlich nicht nötig, denn ich denke *wir* haben mittlerweile verstanden wie die Daten aussehen und wo das Problem liegt. Und die Lösung hatte ich ja auch schon gesagt: Alle beteiligten Programme müssen das gleiche Trennzeichen für Felder verwenden. An welcher Stelle Du eingreifst um das sicherzustellen ist im Grunde egal. Man würde sinnvollerweise an der Stelle ansetzen wo es sich am leichtesten ändern lässt. Das wird wahrscheinlich auf Python-Seite sein, weil man bei Excel sonst wahrscheinlich bei jedem öffnen der CSV-Datei den Weg über den Dialog gehen muss, wo man das Trennzeichen angibt.

Wenn man das Trennzeichen beim Speichern eines Pandas `DataFrame` auf ”deutsch” umstellt, sollte man das für den Dezimaltrenner vielleicht auch gleich machen. Dafür gibt es auch ein Argument bei `to_csv()`.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
an würde sinnvollerweise an der Stelle ansetzen wo es sich am leichtesten ändern lässt. Das wird wahrscheinlich auf Python-Seite sein,
Würde ich hier auch so machen. Z.B. alle , durch ein | ersetzen als Feldtrenner und dann alle . durch ein , , damit Excel den Dezimaltrenner erkannt.

@Gottimperator: du musst dir immer vor Augen halten: CSV ist der _kleinste_ gemeinsame Nenner. CSV ist einfach Text, wo per Konvention ein Zeichen als Delimiter, als Quoting-Charactor und als Escape-Character bestimmt werden kann. Traditionell ist der Delimiter das , - kann aber auch alles andere sein. Du kannst z.B. auch ein A als Delimiter festlegen. Das ganze ist _nicht_ normiert. Wenn man die Möglichkeit hat, sollte man halt CSV vermeiden. Für Python gibt es ja auch diverse Bibliotheken, die xlsx-Dateien schreiben können.
weil das Komma dann zwei verschiedene Bedeutungen hat
In formellen amerikanischen Dokumenten (z.B. Verträge, Bankdokumente) wird das Komma als 1000er-Trenner benutzt, um die Verwirrung komplett zu machen. Im amerikanischen ist 1,234,567.89 das gleiche wie 1.234.567,89 nach deutscher Schreibweise. Wenn man so was in einer CSV-Datei hat, muss man zwangsläufig einen anderen Trenner nutzen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: Naja oder Trenner gleich lassen aber „quoten“, dann kann man das Komma beibehalten:

Code: Alles auswählen

Total,"1,234,567.89"
Ich würde übrigens nicht den | als Trenner nehmen oder die Zeichen nacheinander austauschen sondern das einfach per Pandas laden und dann neu speichern, mit den entsprechenden Angaben zum Feldtrenner und ggf. Dezimalbruchzeichen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

sondern das einfach per Pandas laden und dann neu speichern, mit den entsprechenden Angaben zum Feldtrenner und ggf. Dezimalbruchzeichen.
Mache ich auch so - wenn Pandas im Einsatz ist. Wenn nicht, dann geht's halt auch mit Suchen & Ersetzen.

Gruß, noisefloor
Antworten