2012-12-05 15 views
11

Mam problem z łączeniem kilku szeregów czasowych ze wspólną ramką DataFrame. Przykładowy kod używam:Kilka szeregów czasowych do DataFrame

import pandas 
import datetime 
import numpy as np 

start = datetime.datetime(2001, 1, 1) 
end = datetime.datetime(2001, 1, 10) 
dates = pandas.date_range(start, end) 
serie_1 = pandas.Series(np.random.randn(10), index = dates) 
start = datetime.datetime(2001, 1, 2) 
end = datetime.datetime(2001, 1, 11) 
dates = pandas.date_range(start, end) 
serie_2 = pandas.Series(np.random.randn(10), index = dates) 
start = datetime.datetime(2001, 1, 3) 
end = datetime.datetime(2001, 1, 12) 
dates = pandas.date_range(start, end) 
serie_3 = pandas.Series(np.random.randn(10), index = dates) 

print 'serie_1' 
print serie_1 
print 'serie_2' 
print serie_2 
print 'serie_3' 
print serie_3 

serie_4 = pandas.concat([serie_1,serie_2], join='outer', axis = 1) 
print 'serie_4' 
print serie_4 
serie_5 = pandas.concat([serie_4, serie_3], join='outer', axis = 1) 
print 'serie_5' 
print serie_5 

To daje mi błąd na serie_5 concat (drugi):

Traceback (most recent call last): 
    File "C:\Users\User\Workspaces\Python\Source\TestingPandas.py", line 29, in <module> 
    serie_5 = pandas.concat([serie_4, serie_3], join='outer', axis = 1) 
    File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 878, in concat 
    verify_integrity=verify_integrity) 
    File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 948, in __init__ 
    self.new_axes = self._get_new_axes() 
    File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 1101, in _get_new_axes 
    new_axes[i] = self._get_comb_axis(i) 
    File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 1125, in _get_comb_axis 
    all_indexes = [x._data.axes[i] for x in self.objs] 
AttributeError: 'TimeSeries' object has no attribute '_data' 

chciałbym wynik wyglądać mniej więcej tak (z losowymi wartościami kolumna 2):

    0   1   2 
2001-01-01 -1.224602  NaN  NaN 
2001-01-02 -1.747710 -2.618369  NaN 
2001-01-03 -0.608578 -0.030674 -1.335857 
2001-01-04 1.503808 -0.050492 1.086147 
2001-01-05 0.593152 0.834805 -1.310452 
2001-01-06 -0.156984 0.208565 -0.972561 
2001-01-07 0.650264 -0.340086 1.562101 
2001-01-08 -0.063765 -0.250005 -0.508458 
2001-01-09 -1.092656 -1.589261 -0.481741 
2001-01-10 0.640306 0.333527 -0.111668 
2001-01-11  NaN -1.159637 0.110722 
2001-01-12  NaN  NaN -0.409387 

Co jest nie tak? Jak już mówiłem, prawdopodobnie nie mogę tego rozgryźć i jestem początkującym ...

Odpowiedz

15

Łączenie listy Series zwraca DataFrame. Zatem serie_4 jest DataFrame. serie_3 to Series. Łączenie DataFrame z Series podnosi wyjątek.

Można użyć

serie_5 = pandas.concat([serie_1, serie_2, serie_3], join='outer', axis = 1) 

zamiast.


Innym sposobem jest użycie dołączyć:

serie_3.name = 2 
serie_5 = serie_4.join(serie_3, how = 'outer') 
+0

Dobra, to ja undestand Dlaczego otrzymuję ten błąd. Przetestowałem także, aby połączyć DataFrame z innym DataFrame, zmieniając kod na: serie_5 = pandas.concat ([serie_4, pandas.DataFrame (serie_3)], join = 'outer', axis = 1). Oznacza to, że mogę zatwierdzić dwie serie do ramki danych, a następnie tę ramkę DataFrame z inną ramką DataFrame. Muszę znaleźć ogólne rozwiązanie, w którym mogę dodać szereg serii w pętli i nie mam wcześniej numeru. – Jonas

+0

po prostu utwórz listę w Pythonie i dołącz do niej swoją Serię, a następnie przekaż ją pandas.concat jako @unutbu. –

+0

Korzystanie z łączenia wygląda na generyczne! Zmieniłem go na "serie_5 = serie_4.join (serie_3, how =" outer ")" w celu włączenia 2012-01-12 w powyższym przykładzie. Powodem, dla którego chcę uzyskać ogólne rozwiązanie jest to, że chcę połączyć kilka różnych szeregów czasowych, w których będą brakować danych i wykorzystywać funkcjonalność Pand do obsługi brakujących danych. Dzięki! – Jonas

Powiązane problemy