2016-07-21 11 views
2

Ich habe eine list von Daten, die von MongoDB gelesen wurde. Eine Teilmenge der Daten kann in this gist gefunden werden. Ich erstelle einen Datenrahmen aus dieser Liste und verwende die Datumsfelder, um einen DatetimeIndex zu erstellen. Die Daten wurden ursprünglich in meiner lokalen Zeitzone aufgezeichnet, aber in Mongo sind keine Zeitzoneninformationen beigefügt, daher korrigiere ich die DST wie empfohlen here.Pandas DatetimeIndex NonExistentTimeError nur beim Erstellen von MultiIndex

from datetime import datetime 
from dateutil import tz 

# data is the list from the gist 
dates = [x['Date'] for x in data] 
idx = pd.DatetimeIndex(dates, freq='D') 
idx = idx.tz_localize(tz=tz.tzutc()) 
idx = idx.tz_convert(tz='Europe/Dublin') 
idx = idx.normalize() 
frame = DataFrame(data, index=idx) 
frame = frame.drop('Date', 1) 

alles scheint gut zu funktionieren, und mein Rahmen sieht wie folgt aus

      Events   ID 
2008-03-31 00:00:00+01:00  0.0 116927302 
2008-03-30 00:00:00+00:00 2401.0 116927302 
2008-03-31 00:00:00+01:00  0.0 116927307 
2008-03-30 00:00:00+00:00  0.0 116927307 
2008-03-31 00:00:00+01:00  0.0 121126919 
2008-03-30 00:00:00+00:00 1019.0 121126919 
2008-03-30 00:00:00+00:00  0.0 121126922 
2008-03-31 00:00:00+01:00  0.0 121126922 
2008-03-30 00:00:00+00:00  0.0 121127133 
2008-03-31 00:00:00+01:00  0.0 121127133 
2008-03-31 00:00:00+01:00  0.0 131677370 
2008-03-30 00:00:00+00:00  0.0 131677370 
2008-03-30 00:00:00+00:00  0.0 131677416 
2008-03-31 00:00:00+01:00  0.0 131677416 

Jetzt möchte ich sowohl die ursprüngliche DatetimeIndex und die ID-Spalte verwenden, eine MultiIndex zu erstellen, wie here gezeigt. Wenn ich das versuchen, aber ich erhalte eine Fehlermeldung, die nicht angehoben wurde, als ursprünglich DatetimeIndex

frame.set_index([frame.ID, idx]) 

NonExistentTimeError: 2008-03-30 01:00:00

Schaffung Wenn ich frame.set_index(idx) nur ohne den Multiindex, wirft es keinen Fehler

Versionen

  • Python 2.7.11
  • Pandas 0.18.0

Antwort

1

Sie müssen sort_index zuerst und dann Spalte ID-index anhängen:

frame = frame.sort_index() 
frame.set_index('ID', append=True, inplace=True) 
print (frame) 
            Events 
          ID    
2008-03-30 00:00:00+00:00 168445814  0.0 
          168445633  0.0 
          168445653  0.0 
          245514429  0.0 
          168445739  0.0 
          168445810  0.0 
          332955940  0.0 
          168445875  0.0 
          168445628  0.0 
          217596128 1779.0 
          177336685  0.0 
          180799848  0.0 
          215797757  0.0 
          180800351 1657.0 
          183192871  0.0 
... 
...  

benötigen Wenn eine andere Reihenfolge der Ebenen verwenden DataFrame.swaplevel:

frame = frame.sort_index() 
frame.set_index('ID', append=True, inplace=True) 
frame = frame.swaplevel(0,1) 
print (frame) 
            Events 
ID           
168445814 2008-03-30 00:00:00+00:00  0.0 
168445633 2008-03-30 00:00:00+00:00  0.0 
168445653 2008-03-30 00:00:00+00:00  0.0 
245514429 2008-03-30 00:00:00+00:00  0.0 
168445739 2008-03-30 00:00:00+00:00  0.0 
168445810 2008-03-30 00:00:00+00:00  0.0 
332955940 2008-03-30 00:00:00+00:00  0.0 
168445875 2008-03-30 00:00:00+00:00  0.0 
168445628 2008-03-30 00:00:00+00:00  0.0 
217596128 2008-03-30 00:00:00+00:00 1779.0 
177336685 2008-03-30 00:00:00+00:00  0.0 
180799848 2008-03-30 00:00:00+00:00  0.0 
215797757 2008-03-30 00:00:00+00:00  0.0 
180800351 2008-03-30 00:00:00+00:00 1657.0 
183192871 2008-03-30 00:00:00+00:00  0.0 
186439064 2008-03-30 00:00:00+00:00  0.0 
199856024 2008-03-30 00:00:00+00:00  0.0 
... 
... 

Wenn Notwendigkeit Spalte copy zu index verwenden set_index(frame.ID, ...:

frame = frame.sort_index() 
frame.set_index(frame.ID, append=True, inplace=True) 
frame = frame.swaplevel(0,1) 
print (frame) 
            Events   ID 
ID              
168445814 2008-03-30 00:00:00+00:00  0.0 168445814 
168445633 2008-03-30 00:00:00+00:00  0.0 168445633 
168445653 2008-03-30 00:00:00+00:00  0.0 168445653 
245514429 2008-03-30 00:00:00+00:00  0.0 245514429 
168445739 2008-03-30 00:00:00+00:00  0.0 168445739 
168445810 2008-03-30 00:00:00+00:00  0.0 168445810 
332955940 2008-03-30 00:00:00+00:00  0.0 332955940 
168445875 2008-03-30 00:00:00+00:00  0.0 168445875 
168445628 2008-03-30 00:00:00+00:00  0.0 168445628 
217596128 2008-03-30 00:00:00+00:00 1779.0 217596128 
177336685 2008-03-30 00:00:00+00:00  0.0 177336685 
180799848 2008-03-30 00:00:00+00:00  0.0 180799848 
215797757 2008-03-30 00:00:00+00:00  0.0 215797757 
180800351 2008-03-30 00:00:00+00:00 1657.0 180800351 
183192871 2008-03-30 00:00:00+00:00  0.0 183192871 
186439064 2008-03-30 00:00:00+00:00  0.0 186439064 
... 
...      
+0

Das ist super danke. Wie kommt es, dass der 'sort_index' notwendig ist? –

+1

Hmmm, ich denke viele Funktionen in Pandas brauchen es. Du kannst [docs] (http://pandas.pydata.org/pandas-docs/stable/timeseries.html#datetimeindex) überprüfen - 'Während Pandas dich nicht zwingen, einen sortierten Datumsindex zu haben, haben einige dieser Methoden vielleicht unerwartetes oder falsches Verhalten, wenn die Daten unsortiert sind. Also bitte seien Sie vorsichtig. – jezrael

+0

Das ist interessant, danke für die tolle Antwort und den einsichtsvollen Kommentar (ganz zu schweigen von der Geschwindigkeit der Antwort!) –