Strings verbinden

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.
Antworten
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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?
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

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
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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...?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@ 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...?
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

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
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@ 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.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

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)
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
Antworten