2016-09-14 1 views
3

Ich versuche, einen Pandas-Datenrahmen vom langen zum breiten Format umzugestalten und die Zeitstempel verlieren die Zeitzone.Pandas lang zu weit, ohne Zeitzonenbewusstsein zu verlieren

ist hier ein reproduzierbares Beispiel:

import pandas as pd 
long = pd.DataFrame(dict(
    ind=[1,1,2, 2], 
    events=['event1', 'event2', 'event1', 'event2'], 
    time=[pd.Timestamp('2015-03-30 00:00:00', tz='UTC'), 
     pd.Timestamp('2015-03-30 01:00:00', tz='UTC'), 
     pd.Timestamp('2015-03-30 02:00:00', tz='UTC'), 
     pd.Timestamp('2015-03-30 03:00:00', tz='UTC')])) 

Dann, wenn bei long.time ich eine Zeitzone-aware serie suchen.

0 2015-03-30 00:00:00+00:00 
1 2015-03-30 01:00:00+00:00 
2 2015-03-30 02:00:00+00:00 
3 2015-03-30 03:00:00+00:00 
Name: time, dtype: datetime64[ns, UTC] 

und nach

wide = long.set_index(['ind'] + ['events']).unstack(level=1).reset_index() 

die Zeitzone geht weg wie diese Umformung. Z.B. wide.time.event1

0 2015-03-30 00:00:00 
1 2015-03-30 02:00:00 
Name: event1, dtype: datetime64[ns] 

Gibt es eine andere Art und Weise, dass die Umgestaltung die Zeitzone nicht verlieren?

Antwort

0

pandas verfolgt die Zeitzone. Wenn, Sie unstack, muss diese Umformung in numpy geschehen, die Spur verliert. Dies wird durch

df = pd.concat([long.time, pd.Series(long.time.values)], 
       axis=1, keys=['pandas', 'numpy']) 

df 
bewährten

enter image description here

df.dtypes  

pandas datetime64[ns, UTC] 
numpy   datetime64[ns] 
dtype: object 

Umgehen ist jede Spalte als dtype Sie

for c, col in wide.filter(like='time').iteritems(): 
    wide[c] = col.astype(long.time.dtype) 

wide 

enter image description here

+0

Jede Abhilfe, die Ihnen wichtig sind, um eine Neufassung c könnte vorschlagen? – kael

+0

@kael posted post – piRSquared

Verwandte Themen