Füge Pandas-Dataframe pünktlich und eine weitere Spalte hinzu

Ich habe zwei Pandas Dataframes, die ich versuche, in einem einzigen Dataframe zu kombinieren. Hier ist, wie ich sie aufstellen:

a = {'date':['1/1/2015 00:00','1/1/2015 00:15','1/1/2015 00:30'], 'num':[1,2,3]} b = {'date':['1/1/2015 01:15','1/1/2015 01:30','1/1/2015 01:45'], 'num':[4,5,6]} dfa = pd.DataFrame(a) dfb = pd.DataFrame(b) dfa['date'] = dfa['date'].apply(pd.to_datetime) dfb['date'] = dfb['date'].apply(pd.to_datetime) 

Ich finde dann die earliest und latest Zeitstempel von jedem, und erstellen Sie ein neues Dataframe, das als nur eine Datumsreihe beginnt:

 earliest = min(dfa['date'].min(), dfb['date'].min()) latest = max(dfa['date'].max(), dfb['date'].max()) date_range = pd.date_range(earliest, latest, freq='15min') dfd = pd.DataFrame({'date':date_range}) 

Ich möchte dann alle in ein einziges Dataframe verschmelzen, wobei dfd die Basis ist, da es alle richtigen Zeitstempel enthält. Also dfd ich dfd und dfa und alles ist gut:

 dfd = pd.merge(dfd, dfa, how = 'outer', on = 'date') 

Allerdings, wenn ich es mit dfb verschmelzen, wird die date Serie verschraubt und ich kann nicht herausfinden, warum.

 dfd = pd.merge(dfd, dfb, how = 'outer', on = ['date','num']) 

… ergibt sich:

  date num 0 2015-01-01 00:00:00 1.0 1 2015-01-01 00:15:00 2.0 2 2015-01-01 00:30:00 3.0 3 2015-01-01 00:45:00 NaN 4 2015-01-01 01:00:00 NaN 5 2015-01-01 01:15:00 NaN 6 2015-01-01 01:30:00 NaN 7 2015-01-01 01:45:00 NaN 8 2015-01-01 01:15:00 4.0 9 2015-01-01 01:30:00 5.0 10 2015-01-01 01:45:00 6.0 

Wo würde ich erwarten, dass 4.0 in den Zeitschlitz 2015-01-01 01:15:00 ausfüllen usw. und keine neuen Zeilen erstellen.

Oder wenn ich versuche:

 dfd = pd.merge(dfd, dfb, how = 'outer', on = 'date') 

Ich bekomme:

  date num_x num_y 0 2015-01-01 00:00:00 1.0 NaN 1 2015-01-01 00:15:00 2.0 NaN 2 2015-01-01 00:30:00 3.0 NaN 3 2015-01-01 00:45:00 NaN NaN 4 2015-01-01 01:00:00 NaN NaN 5 2015-01-01 01:15:00 NaN 4.0 6 2015-01-01 01:30:00 NaN 5.0 7 2015-01-01 01:45:00 NaN 6.0 

Das ist auch nicht was ich will (will nur eine einzelne num spalte). Jede Hilfe wäre willkommen.

  • Wie man zwei Pandas-Dataframes (oder Übertragungswerte) durch Vergleich von Wertebereichen zusammenführt
  • Kombiniere zwei Wörterbücher und beseitige Duplikate in Python
  • Bedingte Zusammenführungslisten
  • Zusammenführen aller SQLite-Datenbanken mit verschiedenen Tabellen
  • Wie man mehrere Dicts mit derselben Taste zusammenführt?
  • Zusammenführen einer Liste von Zeitbereichs-Tupeln mit überlappenden Zeitbereichen
  • Ich möchte eine Spalte von value_counts in meinem pandas dataframe erstellen
  • Spalte von einem Datenrahmen zu gruppendaten in python hinzufügen
  • 3 Solutions collect form web for “Füge Pandas-Dataframe pünktlich und eine weitere Spalte hinzu”

     dfa.set_index('date').combine_first(dfb.set_index('date')) \ .asfreq('15T').reset_index() date num 0 2015-01-01 00:00:00 1.0000 1 2015-01-01 00:15:00 2.00 2 2015-01-01 00:30:00 3.00 3 2015-01-01 00:45:00 nan 4 2015-01-01 01:00:00 nan 5 2015-01-01 01:15:00 4.00 6 2015-01-01 01:30:00 5.00 7 2015-01-01 01:45:00 6.00 

    eine andere Lösung

     dfa.append(dfb).set_index('date').asfreq('15T').reset_index() 

    Füge dfa und dfb zuerst hinzu:

     d = pd.merge(dfa, dfb, on=['date','num'], how='outer') 

    Dann kombiniere das Ergebnis mit dfd wie du definiert hast:

     result = pd.merge(d, dfd, on='date', how='outer') print result.sort('date') 

    Ausgabe:

      date num 0 2015-01-01 00:00:00 1.0 1 2015-01-01 00:15:00 2.0 2 2015-01-01 00:30:00 3.0 6 2015-01-01 00:45:00 NaN 7 2015-01-01 01:00:00 NaN 3 2015-01-01 01:15:00 4.0 4 2015-01-01 01:30:00 5.0 5 2015-01-01 01:45:00 6.0 

    Das funktioniert:

     a = {'date':['1/1/2015 00:00','1/1/2015 00:15','1/1/2015 00:30'], 'num':[1,2,3]} b = {'date':['1/1/2015 01:15','1/1/2015 01:30','1/1/2015 01:45'], 'num':[4,5,6]} dfa = pd.DataFrame(a) dfb = pd.DataFrame(b) dfa['date'] = dfa['date'].apply(pd.to_datetime) dfb['date'] = dfb['date'].apply(pd.to_datetime) earliest = min(dfa['date'].min(), dfb['date'].min()) latest = max(dfa['date'].max(), dfb['date'].max()) date_range = pd.date_range(earliest, latest, freq='15min') dfd = pd.DataFrame({'date':date_range}) df_dates = pd.merge(dfa, dfb, how = 'outer') df_final = pd.merge(dfd, df_dates, how = 'outer') df_final 
    Python ist die beste Programmiersprache der Welt.