2016-10-13 9 views
0

Ich suche nach einem guten Weg Joining einen Zeitstempel auszurichten Datenrahmen von denen jeder, dass Sekunden ohne Datenverlust „umfasst“. Insbesondere sieht mein Problem wie folgt:Dataframes auf DatetimeIndex von Sekunden und Minuten für NaNs

Hier d1 mein „main“ Datenrahmen ist.

ind1 = pd.date_range("20120101", "20120102",freq='S')[1:20] 
data1 = np.random.randn(len(ind1)) 
df1 = pd.DataFrame(data1, index=ind1) 

ZB. df1 könnte wie folgt aussehen:

      0 
2012-01-01 00:00:01 2.738425 
2012-01-01 00:00:02 -0.323905 
2012-01-01 00:00:03 1.861855 
2012-01-01 00:00:04 0.480284 
2012-01-01 00:00:05 0.340270 
2012-01-01 00:00:06 -1.139052 
2012-01-01 00:00:07 -0.203018 
2012-01-01 00:00:08 -0.398599 
2012-01-01 00:00:09 -0.568802 
2012-01-01 00:00:10 -1.539783 
2012-01-01 00:00:11 -1.778668 
2012-01-01 00:00:12 -1.488097 
2012-01-01 00:00:13 0.889712 
2012-01-01 00:00:14 -0.620267 
2012-01-01 00:00:15 0.075169 
2012-01-01 00:00:16 -0.091302 
2012-01-01 00:00:17 -1.035364 
2012-01-01 00:00:18 -0.459013 
2012-01-01 00:00:19 -2.177190 

Außerdem habe ich eine andere Datenrahmen, sagen df2:

ind21 = pd.date_range("20120101", "20120102",freq='S')[2:7] 
ind22 = pd.date_range("20120101", "20120102",freq='S')[12:19] 
data2 = np.random.randn(len(ind21+ind22)) 
df2 = pd.DataFrame(data2, index=ind21+ind22) 

df2 sieht aus wie (man beachte die nichtperiodische Zeitstempel):

      0 
2012-01-01 00:00:02 -1.877779 
2012-01-01 00:00:03 1.772659 
2012-01-01 00:00:04 0.037251 
2012-01-01 00:00:05 -1.195782 
2012-01-01 00:00:06 -0.145339 
2012-01-01 00:00:12 -0.220673 
2012-01-01 00:00:13 -0.581469 
2012-01-01 00:00:14 -0.520756 
2012-01-01 00:00:15 -0.562677 
2012-01-01 00:00:16 0.109325 
2012-01-01 00:00:17 -0.195091 
2012-01-01 00:00:18 0.838294 

Jetzt, Ich schließe beide an df und bekomme:

df = df1.join(df2, lsuffix='A') 
          0A   0 
2012-01-01 00:00:01 2.738425  NaN 
2012-01-01 00:00:02 -0.323905 -1.877779 
2012-01-01 00:00:03 1.861855 1.772659 
2012-01-01 00:00:04 0.480284 0.037251 
2012-01-01 00:00:05 0.340270 -1.195782 
2012-01-01 00:00:06 -1.139052 -0.145339 
2012-01-01 00:00:07 -0.203018  NaN 
2012-01-01 00:00:08 -0.398599  NaN 
2012-01-01 00:00:09 -0.568802  NaN 
2012-01-01 00:00:10 -1.539783  NaN 
2012-01-01 00:00:11 -1.778668  NaN 
2012-01-01 00:00:12 -1.488097 -0.220673 
2012-01-01 00:00:13 0.889712 -0.581469 
2012-01-01 00:00:14 -0.620267 -0.520756 
2012-01-01 00:00:15 0.075169 -0.562677 
2012-01-01 00:00:16 -0.091302 0.109325 
2012-01-01 00:00:17 -1.035364 -0.195091 
2012-01-01 00:00:18 -0.459013 0.838294 
2012-01-01 00:00:19 -2.177190  NaN 

Das ist in Ordnung, aber ich möchte die NaN-Werte in Spalte 0 durch den "Minutenwert" von df2 ersetzen. Nur in Fällen, in denen ich keine exakte Übereinstimmung auf der "Sekundenstufe" habe, würde ich gerne auf die Minutenebene zurückkehren. Dies könnte ein einfacher Durchschnitt über alle Werte für diese spezifische Minute sein (hier: 2012-01-01 00:00:00).

Thx für jede Hilfe!

Antwort

0

Verwenden Sie die DateTimeIndex .minute Attribut Gruppierung auszuführen und später die fehlenden Werte füllen mit ihm über jede Gruppe Mittelwert ist (jede Minute):

df['0'] = df.groupby(df.index.minute)['0'].transform(lambda x: x.fillna(x.mean())) 
+1

Perfect, schätzen ich viel Ihre Hilfe, thx! – Tim

Verwandte Themen