2016-07-20 10 views
2

Ich habe konfrontiert kürzlich ein ähnliches Problem (answered here), wodurch Umwandlung eines Datums zu einem Pandas DatetimeIndex und anschließende groupby jene Daten führte zu einem Fehler mit, wo das Datum als 1970-01-01 00:00:00+00:00 erschienen.Pandas DatetimeIndex Umwandlung Termine bis 1970

Ich stehe jetzt in einem anderen Kontext diesem Problem gegenüber, und die vorherige Lösung hilft mir nicht.

Ich habe einen Rahmen wie dieser

import pandas as pd 
from dateutil import tz 

data = { 'Events' : range(1, 5 + 1 ,1), 'ID' : [1, 1, 1, 1, 1]} 
idx = pd.date_range(start='2008-01-01', end='2008-01-05', freq='D', tz=tz.tzlocal()) 
frame = pd.DataFrame(data, index=idx) 



          Events ID 
2008-01-01 00:00:00+00:00  1 1 
2008-01-02 00:00:00+00:00  2 1 
2008-01-03 00:00:00+00:00  3 1 
2008-01-04 00:00:00+00:00  4 1 
2008-01-05 00:00:00+00:00  5 1 

und ich möchte ab dem Zeitpunkt, den Index zu ändern, zu einem MultiIndex von [date, ID], aber dabei, dass „1970 Fehler“ erscheint

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

           Events ID 
ID          
1 2008-01-01 00:00:00+00:00  1 1 
    1970-01-01 00:00:00+00:00  2 1 
    1970-01-01 00:00:00+00:00  3 1 
    1970-01-01 00:00:00+00:00  4 1 
    1970-01-01 00:00:00+00:00  5 1 

Versionen

  • Python 2. 7.11
  • Pandas 0.18.0
+4

Bitte geben Sie Ihre Datenframes und Code als Text, nicht als Bilder. –

+0

Ich weiß nicht, wie man den DataFrame sauber kopieren/einfügen kann. Kann ich fragen, was der Unterschied ist? Ich könnte den DataFrame im Notizbuch drucken und dann diese Ausgabe kopieren/einfügen, aber es würde sicherlich viel hässlicher aussehen? –

+2

Wenn Sie Bilder posten, müsste jeder, der Ihnen helfen möchte, alles manuell eingeben. Bitte nehmen Sie sich die Zeit, es selbst zu tun. –

Antwort

1

Die akzeptierte Antwort Ihrer anderen Frage für mich arbeitet (Python 3.5.2, Pandas 0.18.1):

print(frame.set_index([frame.ID, frame.index])) 

#        Events ID 
# ID          
# 1 2008-01-01 00:00:00-05:00  1 1 
# 1970-01-01 00:00:00-05:00  2 1 
# 1970-01-01 00:00:00-05:00  3 1 
# 1970-01-01 00:00:00-05:00  4 1 
# 1970-01-01 00:00:00-05:00  5 1 

frame.index = frame.index.tz_convert(tz='EST') 
print(frame.set_index([frame.ID, frame.index])) 

#        Events ID 
# ID          
# 1 2008-01-01 00:00:00-05:00  1 1 
# 2008-01-02 00:00:00-05:00  2 1 
# 2008-01-03 00:00:00-05:00  3 1 
# 2008-01-04 00:00:00-05:00  4 1 
# 2008-01-05 00:00:00-05:00  5 1 

(Meine Ortszeit unterscheidet sich von Ihr.)

+0

Können Sie in lokal konvertieren? – Merlin

+0

Wie die oben genannte Antwort sagt: alles außer 'tz.tzlocal()'. –

+0

Das funktioniert in der Tat jetzt für mich, aber es hat nicht in meiner vorherigen Frage. Sie können für diesen Fall sehen, die angenommene Antwort schlug mehrere Lösungen vor, diese funktionierte damals nicht, aber es tut jetzt. Danke für deine Hilfe –

1
frame = frame.reset_index() 
frame = frame.set_index([frame.ID, frame.index]) 
print frame 

         index Events ID 
ID           
1 0 2008-01-01 00:00:00-05:00  1 1 
    1 2008-01-02 00:00:00-05:00  2 1 
    2 2008-01-03 00:00:00-05:00  3 1 
    3 2008-01-04 00:00:00-05:00  4 1 
    4 2008-01-05 00:00:00-05:00  5 1 


print frame.info() 

<class 'pandas.core.frame.DataFrame'> 
MultiIndex: 5 entries, (1, 0) to (1, 4) 
Data columns (total 4 columns): 
level_0 5 non-null int64 
index  5 non-null datetime64[ns, tzlocal()] 
Events  5 non-null int64 
ID   5 non-null int64 
dtypes: datetime64[ns, tzlocal()](1), int64(3) 
memory usage: 200.0+ bytes 
+0

Dies funktioniert auch für mich und scheint mir eine bessere Lösung - keine Notwendigkeit, mit Zeitzonen herumzuspielen --- bis Pandas 0.19 [email protected] Philip O'Brien: Wenn es auch für dich funktioniert, denke ich, dass du diese Antwort anstelle meiner akzeptieren solltest. –