2016-09-14 2 views
3

Я пытаюсь переделать рамку данных pandas из длинного в широкий формат, а временные метки теряют часовой пояс.Pandas длинный до широкого без потери осведомленности о часовом поясе

Вот воспроизводимый пример:

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')])) 

Тогда при взгляде на long.time я получаю часовой пояс-Aware Серию.

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] 

и после изменения формы как этот

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

часовой пояс, уходит. Например. wide.time.event1

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

Есть еще один способ изменения формы, что не теряет часовой пояс?

ответ

0

pandas отслеживает часовой пояс. Когда, вы unstack, это изменение должно происходить в numpy, который теряет трек. Это подтверждается

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

df 

enter image description here

df.dtypes  

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

Обходной переделка каждый столбец как DTYPE вы заботитесь о

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

wide 

enter image description here

+0

Любой обходной путь, который вам с подскажите? – kael

+0

@kael up post – piRSquared