2017-04-03 2 views
2

Ich versuche, zwischen zwei Datumsspalten aus zwei Datenrahmen in Python Pandas zu interpolieren.Interpolieren Datumsspalten zwischen zwei Datenrahmen Pandas

Ich mag die „EVENT“ Spalten „DrillDate“ kombinieren, von der dfDrillTable zum am nächsten nächsten Vorkommen Datum im dfCompTable. Die dfDrillTable hat ein "Drilldate", das immer vor der dfCompTable "OpenDate" auftritt. Die dfDrillTable und dfCompTable müssen beide auf "Name" verbunden sein, aber nur dfDrillTable hat eine eindeutige "EVENT", die ich versuche, die beiden Datenrahmen zu verknüpfen.

Es gibt einige Bohrlochnamen, die EVENT-Daten in der DrillTable enthalten, die nicht in der dfCompTable (und im Vera-Vera) vorhanden sind. Ich brauche diese, um noch in die Tabelle zu kommen, aber als Leerzeichen, wo die Werte nicht existieren.

Ich habe zwei Beispieldatenrahmen als Referenz unten erstellt. Dann ein Drittel, um das Ergebnis zu zeigen, das ich möchte.

Ich weiß, es gibt mehrere Möglichkeiten, dies zu tun mit äußerenjoins und dies und das, aber ich war nur auf der Suche nach der saubersten, absolut narrensichere Art der Interpolation zwischen zwei Daten.

#dfDrillTable 

Name EVENT DrillDate 
0 W1 E1 2000-01-01 
1 W1 E2 2000-03-01 
2 W2 E3 2000-04-01 
3 W1 E4 2000-05-15 
4 W2 E5 2000-01-10 
5 W3 E6 2000-02-01 
6 G1 E1 2000-02-02 

    #dfCompTable 
    Name OpenDate 
0 W1 2000-01-02 
1 W1 2000-03-15 
2 W1 2000-05-10 
3 W1 2000-05-20 
4 W2 2000-01-15 
5 W3 2000-02-10 
6 X1 2016-05-05 


    #dfInterp Outcome 


Name EVENT DrillDate OpenDate 
0 W1 E1 2000-01-01 2000-01-02 
1 W1 E2 2000-03-01 2000-03-15 
2 W1 E3 2000-04-01 2000-05-10 
3 W1 E4 2000-05-15 2000-05-20 
4 W2 E5 2000-01-10 2000-01-15 
5 W3 E6 2000-02-01 2000-02-10 
6 G1 E1 2000-01-10 NaT 
7 X1  NaT 2016-05-05 

hier ist der Code der Tabellen

# Two DataTables 
raw_data = {'Name': ['W1', 'W1', 'W2', 'W1', 'W2','W3','G1'], 
      'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1'], 
     'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','02/02/2000']} 
dfDrillTable = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate']) 
dfDrillTable['DrillDate'] = pd.to_datetime(dfDrillTable['DrillDate']) 
dfDrillTable 

raw_data2 = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','X1'], 
     'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','05/05/2016']} 
dfCompTable = pd.DataFrame(raw_data2, columns = ['Name','OpenDate']) 
dfCompTable['OpenDate'] = pd.to_datetime(dfCompTable['OpenDate']) 
dfCompTable 

und das Ergebnis zu schaffen:

# Hopefull Outcome 
raw_data = {'Name': ['W1', 'W1', 'W1', 'W1', 'W2','W3','G1','X1'], 
      'EVENT':['E1', 'E2', 'E3', 'E4', 'E5','E6','E1',''], 
     'DrillDate': ['01/01/2000', '03/01/2000', '04/01/2000', '05/15/2000', '01/10/2000','02/01/2000','01/10/2000',''], 
      'OpenDate': ['01/02/2000', '03/15/2000', '05/10/2000', '05/20/2000', '01/15/2000','02/10/2000','','05/05/2016']} 
dfInterp = pd.DataFrame(raw_data, columns = ['Name','EVENT','DrillDate','OpenDate']) 
dfInterp['DrillDate'] = pd.to_datetime(dfInterp['DrillDate']) 
dfInterp['OpenDate'] = pd.to_datetime(dfInterp['OpenDate']) 
dfInterp 

Antwort

1

wir pd.merge_asof verwenden: < - Link zur Dokumentation

pd.merge_asof ist neu in Version 0.19.0 Stellen Sie sicher, dass Sie die neuesten Pandas installiert haben.

dfInterp = pd.merge_asof(dfCompTable.sort_values(by="OpenDate") 
         ,dfDrillTable.sort_values(by="DrillDate") 
         ,left_on="OpenDate",right_on="DrillDate") 

dfInterp[['Name_x','EVENT','DrillDate','OpenDate']].sort_values(by='Name_x') 

    Name_x EVENT DrillDate OpenDate 
0  W1 E1 2000-01-01 2000-01-02 
3  W1 E2 2000-03-01 2000-03-15 
4  W1 E3 2000-04-01 2000-05-10 
5  W1 E4 2000-05-15 2000-05-20 
1  W2 E5 2000-01-10 2000-01-15 
2  W3 E6 2000-02-01 2000-02-10 
+0

Danke, Dies funktioniert auf die Datenframes in der Frage. (Ich denke, dass Sie in einem extra _on = "DrillDate" obwohl). Wenn ich die Gleichung mit meinen tatsächlichen Daten durchführe, bekomme ich einen "ValueError: Linke Schlüssel müssen sortiert werden", ich sortiere sie aber immer noch nicht. Es gibt Duplikate von Daten und auch Datenpunkte, die nicht in beiden Datenrahmen enthalten sind. ist das wichtig? Danke noch einmal. – brandog

+0

Können Sie eine Eingabe generieren, die fehlschlägt? –

+0

Hallo, tut mir leid, dass ich so spät zurück bin. Ich sah den Grund dafür, dass es fehlgeschlagen war, weil in meiner ursprünglichen Tabelle leere Werte am offenen Datum waren. Ich entfernte diese und der Code lief ohne Fehler. Die Ausgabe ist nicht das, wonach ich gesucht habe. Es verbindet die Werte nicht durch die Spalte "Name". Stattdessen wird nur das nächste Datum gesucht, unabhängig von "Name". Ich habe den Code in der obigen Frage aktualisiert, um dies zu zeigen. Gibt es eine Möglichkeit, einen weiteren Teil der Logik zu interpolieren, wenn die Spalten Name =? Vielen Dank. – brandog

Verwandte Themen