2014-09-28 12 views
7

Z serii:Nie można stosować metody na znaczników czasu z wykorzystaniem serii Zabudowy

0 1411161507178 
1 1411138436009 
2 1411123732180 
3 1411167606146 
4 1411124780140 
5 1411159331327 
6 1411131745474 
7 1411151831454 
8 1411152487758 
9 1411137160544 
Name: my_series, dtype: int64 

Polecenie (konwersja do datownika, lokalizować i konwertować do EST) działa:

pd.to_datetime(my_series, unit='ms').apply(lambda x: x.tz_localize('UTC').tz_convert('US/Eastern')) 

ale ten zawiedzie:

pd.to_datetime(my_series, unit='ms').tz_localize('UTC').tz_convert('US/Eastern') 

z:

TypeError         Traceback (most recent call last) 
<ipython-input-3-58187a4b60f8> in <module>() 
----> 1 lua = pd.to_datetime(df[column], unit='ms').tz_localize('UTC').tz_convert('US/Eastern') 

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst) 
    3492     ax_name = self._get_axis_name(axis) 
    3493     raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' % 
-> 3494         ax_name) 
    3495    else: 
    3496     ax = DatetimeIndex([],tz=tz) 

TypeError: index is not a valid DatetimeIndex or PeriodIndex 

i tak nie ten:

my_series.tz_localize('UTC').tz_convert('US/Eastern') 

z:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-0a7cb1e94e1e> in <module>() 
----> 1 lua = df[column].tz_localize('UTC').tz_convert('US/Eastern') 

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst) 
    3492     ax_name = self._get_axis_name(axis) 
    3493     raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' % 
-> 3494         ax_name) 
    3495    else: 
    3496     ax = DatetimeIndex([],tz=tz) 

TypeError: index is not a valid DatetimeIndex or PeriodIndex 

O ile mi zrozumieć, drugie podejście powyżej (pierwsza, która nie) powinno działać . Dlaczego to się nie udaje?

+0

Nie jestem pewien, dlaczego twoja pierwsza metoda działa w rzeczywistości, tak jak w przypadku twojego drugiego, stwierdzenie błędu jest całkiem jasne, jeśli w rzeczywistości twój indeks był twoimi wartościami Int64, to drugie podejście działa . – EdChum

Odpowiedz

5

tz_localize/tz_convert działać na INDEKS obiektu, a nie na wartości. Najprościej jest po prostu przekształcić go w indeks, a następnie zlokalizować i przekonwertować. Jeśli następnie chce Series powrotem można użyć to_series()

In [47]: pd.DatetimeIndex(pd.to_datetime(s,unit='ms')).tz_localize('UTC').tz_convert('US/Eastern') 
Out[47]: 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2014-09-19 17:18:27.178000-04:00, ..., 2014-09-19 10:32:40.544000-04:00] 
Length: 10, Freq: None, Timezone: US/Eastern 
14

Jako odpowiedź Jeff wspomina, tz_localize() i tz_convert() ustawę o indeksie, a nie danych. To była dla mnie ogromna niespodzianka.

Ponieważ odpowiedź Jeffa została napisana, Panda 0,15 dodała nowy akcesor Series.dt, który pomaga w przypadku użycia. Teraz możesz to zrobić:

pd.to_datetime(my_series, unit='ms').dt.tz_localize('UTC').dt.tz_convert('US/Eastern') 
+0

To jest świetne! Nie chcę ustawiać TimeStamp jako indeksu, czasami możemy mieć dwa TimeStamp, ponieważ to naprawdę frustrujące, że musimy go przekonwertować na indeks. – user40780

Powiązane problemy