2016-07-20 5 views
2

Я недавно сталкивался с подобной проблемой (answered here), в котором преобразование даты к пандам DatetimeIndex и последующий groupby с использованием этих дат привел к ошибке, где дата появилась в 1970-01-01 00:00:00+00:00.Пандас DatetimeIndex преобразования даты к 1970

Теперь я столкнулся с этой проблемой в другом контексте, и предыдущее решение не помогает мне.

У меня есть кадр, как этот

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 

, и я хочу, чтобы изменить индекс от всего дня, к MultiIndex из [date, ID], но при этом, что «1970 ошибка» появляется

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 

Версии

  • Python 2. 7.11
  • Панды 0.18.0
+4

Пожалуйста, разместите свои данные и код как текст, а не как изображения. –

+0

Я не знаю, как очистить/вставить DataFrame. Могу ли я спросить, в чем разница? Я мог бы распечатать DataFrame в записной книжке, а затем скопировать/вставить этот вывод, но это выглядело бы намного уродливее? –

+2

Если вы отправляете изображения, любой, кто пытается вам помочь, должен будет вручную набрать все. Пожалуйста, найдите время, чтобы сделать это самостоятельно. –

ответ

1

Принятый ответ на ваш вопрос другой работает для меня (Python 3.5.2, Панды 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 

(Мое местное время отличается от ваш.)

+0

Можете ли вы конвертировать в локальную? – Merlin

+0

Как сказано выше: ничего, кроме 'tz.tzlocal()'. –

+0

Это действительно работает для меня сейчас, но это не было в моем предыдущем вопросе. Вы можете видеть, что в этом случае принятый ответ предложил несколько решений, этот не работал тогда, но теперь это происходит. Спасибо за вашу помощь. –

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

Это тоже работает для меня, и мне кажется, что это лучший способ обхода - не нужно возиться с часовыми поясами --- до тех пор, пока не появится панда [email protected] O'Brien: если это сработает и для вас, я думаю, вы должны принять этот ответ вместо моего. –

Смежные вопросы