2016-04-21 3 views
0

Ich habe ein Daframe mit einer Reihe von Zeitraum 1 Monat und Frequenz eine Sekunde.fullfil ein leerer Datenrahmen mit gemeinsamen Index-Werte von einem anderen Daframe

Das Problem der Zeitschritt zwischen den Datensätzen ist nicht immer 1 Sekunde.

time    c1 c2 
2013-01-01 00:00:01 5 3 
2013-01-01 00:00:03 7 2 
2013-01-01 00:00:04 1 5 
2013-01-01 00:00:05 4 3 
2013-01-01 00:00:06 5 6 
2013-01-01 00:00:09 4 2 
2013-01-01 00:00:10 7 8 

Dann möchte ich einen leeren Datenrahmen mit den gleichen Spalten erstellen und für den gesamten Zeitraum korrigiert. Das bedeutet mit so vielen Aufzeichnungen wie Sekunden einen Monat hat. Dieser leere Datenrahmen ist im Prinzip mit nan Werten erfüllt:

time    c1 c2 
2013-01-01 00:00:01 nan nan 
2013-01-01 00:00:02 nan nan 
2013-01-01 00:00:03 nan nan 
2013-01-01 00:00:04 nan nan 
2013-01-01 00:00:05 nan nan 
2013-01-01 00:00:06 nan nan 
2013-01-01 00:00:07 nan nan 
2013-01-01 00:00:08 nan nan 
2013-01-01 00:00:09 nan nan 
2013-01-01 00:00:10 nan nan 

beide Dann vergleichen und erfüllen die leeren, mit den gemeinsamen Reihen mit meinem ersten Datenrahmen. Das Nicht-Common sollte mit Nan-Werten bleiben.

time    c1 c2 
2013-01-01 00:00:01 5 3 
2013-01-01 00:00:02 nan nan 
2013-01-01 00:00:03 7 2 
2013-01-01 00:00:04 1 5 
2013-01-01 00:00:05 4 3 
2013-01-01 00:00:06 5 6 
2013-01-01 00:00:07 nan nan 
2013-01-01 00:00:08 nan nan 
2013-01-01 00:00:09 4 2 
2013-01-01 00:00:10 7 8 

Mein Versuch:

#Read from a file the first dataframe 
df1=pd.read_table(fin,parse_dates=0],names=ch,index_col=0,header=0,decimal='.',skiprows=c) 
#create an empty dataframe 
N=86400 * 31#seconds per month 
index=pd.date_range(df1.index[0], periods=N-1, freq='1s') 
df2=pd.DataFrame(index=index, columns=df1.columns) 

Jetzt versuche ich mit merge oder concat aber ohne das erwartete Ergebnis:

df2.merge(df1, how='outer') 
pd.concat([df2,df1], axis=0, join='outer') 

Antwort

0

Sie müssen die Datenrahmen reindex.

import pandas 
df = pandas.read_table(filename, **options) 
N = 86400 * 31 #seconds per month 
dates = pandas.date_range(df.index[0], periods=N-1, freq='1s') 
df = df.reindex(dates) 

Hier ist eine reproduzierbare Demonstration:

df = pandas.DataFrame(
    data={'A': range(0, 10), 'B': range(0, 20, 2)}, 
    index=pandas.date_range('2012-01-01', freq='2s', periods=10) 
).reindex(pandas.date_range('2012-01-01', freq='1s', periods=25)) 

print(df) 

         A  B 
2012-01-01 00:00:00 0.0 0.0 
2012-01-01 00:00:01 NaN NaN 
2012-01-01 00:00:02 1.0 2.0 
2012-01-01 00:00:03 NaN NaN 
2012-01-01 00:00:04 2.0 4.0 
2012-01-01 00:00:05 NaN NaN 
2012-01-01 00:00:06 3.0 6.0 
2012-01-01 00:00:07 NaN NaN 
2012-01-01 00:00:08 4.0 8.0 
2012-01-01 00:00:09 NaN NaN 
2012-01-01 00:00:10 5.0 10.0 
2012-01-01 00:00:11 NaN NaN 
2012-01-01 00:00:12 6.0 12.0 
2012-01-01 00:00:13 NaN NaN 
2012-01-01 00:00:14 7.0 14.0 
2012-01-01 00:00:15 NaN NaN 
2012-01-01 00:00:16 8.0 16.0 
2012-01-01 00:00:17 NaN NaN 
2012-01-01 00:00:18 9.0 18.0 
2012-01-01 00:00:19 NaN NaN 
2012-01-01 00:00:20 NaN NaN 
2012-01-01 00:00:21 NaN NaN 
2012-01-01 00:00:22 NaN NaN 
2012-01-01 00:00:23 NaN NaN 
2012-01-01 00:00:24 NaN NaN 
+0

Funktioniert nicht *** Valueerror:. Nicht von einer doppelten Achse – gis20

+0

@ gis20 sehen meine Änderungen indizieren kann. Ich kann dir nicht mehr helfen als das ohne ein reproduzierbares Beispiel, das dein Problem zeigt. –

1

Das glaube ich nicht, dass Sie einen zweiten Datenrahmen benötigen. Wenn Sie resample ohne fill_method aufrufen, speichert es NaN s für die fehlenden Perioden:

df.resample("s").max() 
Out[62]: 
         c1 c2 
time       
2013-01-01 00:00:01 5.0 3.0 
2013-01-01 00:00:02 NaN NaN 
2013-01-01 00:00:03 7.0 2.0 
2013-01-01 00:00:04 1.0 5.0 
2013-01-01 00:00:05 4.0 3.0 
2013-01-01 00:00:06 5.0 6.0 
2013-01-01 00:00:07 NaN NaN 
2013-01-01 00:00:08 NaN NaN 
2013-01-01 00:00:09 4.0 2.0 
2013-01-01 00:00:10 7.0 8.0 

max() hier nur eine willkürliche Methode ist so, dass es einen Datenrahmen zurück. Sie können es durch Mittelwert, Min. Usw. ersetzen, vorausgesetzt, Sie haben keine Duplikate. Wenn Sie Duplikate haben, werden sie von dieser Funktion aggregiert.

Wie Paul H in den Kommentaren vorgeschlagen, können Sie df.resample("s").asfreq() ohne Aggregation verwenden. Es überspringt einen unnötigen Schritt der Aggregation, so dass es wahrscheinlich effizienter ist. Es wird einen Fehler verursachen, wenn Sie doppelte Werte im Index haben.

+0

Ich möchte die gemeinsamen Werte so behalten, wie sie sind, nicht resampling sie – gis20

+0

@ gis20 da die Frequenzen die gleichen sind, sollten Sie die gemeinsamen Werte erhalten, wie sie sind. Gibt es einen Unterschied? – ayhan

+1

'df.resample (" s "). Asfreq()' wird blind die Daten updaten, ohne irgendeine Art von Reduktionsfunktion anzuwenden/ –

0

Wenn Sie bereits die Indizes im Datenrahmen "nan" einrichten, sollten Sie in der Lage sein, einfach loc zu verwenden. Indexing ist eine wirklich wichtige Sache zu meistern, wenn Pandas verwenden. Es spart Ihnen eine Menge Zeit, macht Ihren Code viel sauberer und kann Ihre Leistung wirklich verbessern.

Vorsichtig aber müssen die Indizes und Spalten identisch sein, damit der Trick unten so funktioniert wie er ist.

>>> import pandas as pd 
>>> import numpy as np 

>>> df1 = pd.DataFrame(np.random.rand(10, 3), columns=['A', 'B', 'C']) 
>>> df1 
      A   B   C 
0 0.171502 0.258416 0.118326 
1 0.215456 0.462122 0.858173 
2 0.373549 0.946400 0.579845 
3 0.606289 0.289552 0.473658 
4 0.885899 0.783747 0.089975 
5 0.674208 0.639710 0.105642 
6 0.404775 0.541389 0.268101 
7 0.374609 0.693916 0.743575 
8 0.074773 0.150072 0.135555 
9 0.230431 0.202417 0.466538 

>>> df2 = pd.DataFrame(np.nan, index=range(15), columns=['A', 'B', 'C']) 
>>> df2 
    A B C 
0 NaN NaN NaN 
1 NaN NaN NaN 
2 NaN NaN NaN 
3 NaN NaN NaN 
4 NaN NaN NaN 
5 NaN NaN NaN 
6 NaN NaN NaN 
7 NaN NaN NaN 
8 NaN NaN NaN 
9 NaN NaN NaN 
10 NaN NaN NaN 
11 NaN NaN NaN 
12 NaN NaN NaN 
13 NaN NaN NaN 
14 NaN NaN NaN 

>>> df2.loc[df1.index] = df1 # This is where the magic happens 
>>> df2 
      A   B   C 
0 0.171502 0.258416 0.118326 
1 0.215456 0.462122 0.858173 
2 0.373549 0.946400 0.579845 
3 0.606289 0.289552 0.473658 
4 0.885899 0.783747 0.089975 
5 0.674208 0.639710 0.105642 
6 0.404775 0.541389 0.268101 
7 0.374609 0.693916 0.743575 
8 0.074773 0.150072 0.135555 
9 0.230431 0.202417 0.466538 
10  NaN  NaN  NaN 
11  NaN  NaN  NaN 
12  NaN  NaN  NaN 
13  NaN  NaN  NaN 
14  NaN  NaN  NaN