Seite 1 von 1

Strings verbinden

Verfasst: Montag 19. Juli 2021, 20:25
von Bebbi
Hallo zusammen

Ich habe folgendes Problem. Gerne würde ich die beiden Strings VOL90D und EURCHF miteinander verbinden. Mit folgendem Code habe ich das auch hingekriegt:

Code: Alles auswählen

Input_data = pd.concat([VOL90D,EURCHF], axis=1)
Input_data.head(10)
Mein Problem liegt allerdings darin, dass die Zeitachsen unterschiedlich sind. Konkret ist es so, dass im ersten String (VOL90) Werte für die Tage 01.01., 02.01., 03.01. und 04.01. vorhanden sind. Im zweiten String kann es allerdings sein, dass nur für den 01.01., 02.01. und dann für den 04.01. ein Wert vorhanden ist. Beim Zusammenführen der Strings möchte ich nicht diese Ergebnis

Code: Alles auswählen

	DATE	VOL90D	DATE	EURCHF
0	01.01.2016	21.472	01.01.2016	1.08733
1	02.01.2016	21.472	04.01.2016	1.08544
2	03.01.2016	21.472	05.01.2016	1.08422
3	04.01.2016	21.499	06.01.2016	1.08596
Sondern folgende Daten

Code: Alles auswählen

	DATE	VOL90D	DATE	EURCHF
0	01.01.2016	21.472	01.01.2016	1.08733
1	02.01.2016	21.472	02.01.2016	1.08544
2	03.01.2016	21.472	03.01.2016	1.08544
3	04.01.2016	21.499	04.01.2016	1.08544
Konkret sollen fehlende Werte mit dem Vortageswert ergänzt werden. Dabei sollte das System merken, welcher Wert zu welchem Datum gehört und nicht den Wert aus String 1 für den 03.01. mit dem Wert aus String 2 vom 05.01. verknüpfen.

Was muss ich tun?

Re: Strings verbinden

Verfasst: Dienstag 20. Juli 2021, 09:11
von peterpy
Hallo Bebbi,
wenn ich dich recht verstehe, sollen die Daten so aussehen:

DATE VOL90D DATE EURCHF
0 01.01.2016 21.472 01.01.2016 1.08733
1 02.01.2016 21.472 02.01.2016 1.08733
2 03.01.2016 21.472 03.01.2016 1.08733
3 04.01.2016 21.499 04.01.2016 1.08544

Dann vergleich doch Datum VOL90D und Datum EURCHF
Sind die gleich, kannst Du den Wert übernehmen, sonst übernimmst Du den Wert vom Vortag.

Gruss Peter

Re: Strings verbinden

Verfasst: Dienstag 20. Juli 2021, 19:21
von Bebbi
Das Problem ist aber, dass ich je nach String fehlende Tage habe. In einem solchen Fall verbindet mir concat unter Umständen den Wert vom 02.01.2016 von VOL90D mit jenem vom 03.01.2016 von EURCHF. Das sollte allerdings nicht geschehen da ich sonst die Werte nicht auswerten kann.

Re: Strings verbinden

Verfasst: Dienstag 20. Juli 2021, 19:34
von Bebbi
Ich benötige einen Befehl, welcher die Daten eines Strings fixiert, z.B. jeden Tag in einem Jahr und danach diesen Tagen den entsprechenden Wert aus den anderen Strings zuweist. Ist das möglich oder muss ich die Daten alle manuell bearbeiten...?

Re: Strings verbinden

Verfasst: Dienstag 20. Juli 2021, 19:39
von Bebbi
@ Peter, habe Deine Antwort/Frage noch einmal durchgelesen. Deine Tabelle würde stimmen. Mit welchem Befehl kann ich das bewerkstelligen? Alle Strings haben unterschiedliche Datumsangaben. Wenn ich einfach concat nehme, wird die erste Zeile von String 1 mit der ersten Zeile von String 2 kombiniert, oder irre ich da...?

Re: Strings verbinden

Verfasst: Mittwoch 21. Juli 2021, 06:54
von peterpy
Hallo Bebby
(Baslerbebby?)
irgendwie bekommst Du die Daten, wie sagst Du nicht.
Also wenn die Daten ankommen, bekommst Du als ersten Datensatz z.B.
01.01.2016 21.472 01.01.2016 1.08733

als zweiten Datensatz:
02.01.2016 21.472
oder?:
02.01.2016 21.472 None None
Die Daten müssen schon beim Eintreffen kontrolliert und eventuell ergänzt werden.

Gruss Peter

Re: Strings verbinden

Verfasst: Mittwoch 21. Juli 2021, 15:41
von Bebbi
Ja, Baslerbebbi :-)

Meine Daten befinden sich in einzelnen csv-Files, wenn ich diese zusammenfasse erhalte ich folgendes Resultat:

Code: Alles auswählen

0	01.01.2016	21.472	01.01.2016	1.08733	01.01.2016	1.0014	01.01.2016	37.04	01.01.2016	-0.062	01.01.2016	0.629
1	02.01.2016	21.472	04.01.2016	1.08544	04.01.2016	1.0021	02.01.2016	37.04	04.01.2016	-0.047	04.01.2016	0.566
2	03.01.2016	21.472	05.01.2016	1.08422	05.01.2016	1.0087	03.01.2016	37.04	05.01.2016	-0.073	05.01.2016	0.540
Wie man erkennt, stimmt die Zeile 0, da jeder String am 01.01.2016 beginnt. Bereits danach - wie in Zeile 1 erkennbar - werden die Zeilen vermischt (02.01.2016 mit 04.01.2016 mit 02.01.2016 etc.). Ich möchte aber, dass er mir die Daten zum jeweiligen richtigen Datum zuweist und wenn kein Wert vorhanden ist, den vorhergehenden Wert einfüllt.

Re: Strings verbinden

Verfasst: Mittwoch 21. Juli 2021, 20:28
von Bebbi
@ Peter, wenn Du schreibst, dass die Daten schon beim Eintreffen kontrolliert und eventuell ergänzt werden müssen meinst Du dass ich diese zuvor in Excel manuell bearbeiten muss? Bei 14 Dateien mit jeweils rund 1'500 Datensätzen wird mich das einige Abende beschäftigen. Wenn das aber nicht anders geht muss das wohl so sein.

Re: Strings verbinden

Verfasst: Donnerstag 22. Juli 2021, 10:42
von peterpy
Hallo, Bebbi,
Du sagst immer noch nicht, wie Du die Daten bekommst.
Input_data ist eine Liste. Doch was für einen Typ haben die Variablen VOL90D und EURCHF ?
Mein "Glaschügeli" bleibt auch dunkel.
Also nehm ich an, die Daten sind in Listenform.
Und Du kannst Du das so lösen:
Der erste und der vierte Datensatz sind unvollständig.
Da der erste Datensatz ja keinen Vorgänger hat, wird dieser mit einem Dummywert ergänzt.

Code: Alles auswählen

from copy import deepcopy

DATEN = [
    [['A', 'a'], []],
    [['B', 'b'], ['B', 2]],
    [['C', 'c'], ['C', 3]],
    [['D', 'd'], ['D', 4]],
    [['E', 'e'], []],
    [['F', 'f'], ['F', 5]],
    ]
    # Datenliste zur Simulation


def pruefe_daten():    
    for i, datensatz in enumerate(DATEN):
        neuer_datensatz = []
        if len(datensatz[1]) != 0:
            #datensatz ist vollständig
            alter_datensatz = deepcopy(datensatz)
        if i == 0 and len(datensatz[1]) == 0:
            # erster datensatz ist unvollständig
            neuer_datensatz.append(datensatz[0])
            neuer_datensatz.append([datensatz[0][0], 'X'])
            # erster datensatz ist unvollständig und wird mit X ergänzt            
            alter_datensatz = [[0,0], [0, 0]]
        else:
            neuer_datensatz = ergaenze_datensatz(datensatz, i, neuer_datensatz,
                                                 alter_datensatz)
        print(i, neuer_datensatz)    

def ergaenze_datensatz(datensatz, i, neuer_datensatz, alter_datensatz):    
    neuer_datensatz.append(datensatz[0]) 
    neuer_datensatz.append([neuer_datensatz[0][0],alter_datensatz[1][1]])
    return neuer_datensatz

if __name__ == '__main__':
    pruefe_daten()
Du kannst auch prüfen, was die Daten für einen Typ haben und wie sie aussehen.

Code: Alles auswählen

print(Input_data[0], "Type", (type(Input_data[0]), "\n", Input_data[1], "Type", type(Input_data[1])) 
Sollte meine Annahme nicht stimmen, stell doch den Ausdruck vom print hier rein.
Gruss Peter (ein Nachbar)

Re: Strings verbinden

Verfasst: Donnerstag 22. Juli 2021, 18:26
von narpfel
@Bebbi: Das sieht für mich so aus, als würdest du `pandas.reindex` suchen, bzw. hier wahrscheinlich `reindex_like`. Mit `method="ffill"` gibst du an, dass der letzte existierende Wert zum Auffüllen benutzt werden soll.

Hast du das Pandas-Tutorial mal durchgearbeitet? `reindex` wird da unter „Essential basic functionality“ gelistet.