No se pueden aplicar los métodos en las marcas de tiempo utilizando las funciones integradas de la Serie

En la siguiente serie:

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 

Este comando (convertir a marca de tiempo, localizar y convertir a EST) funciona:

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

pero este falla

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

con:

 TypeError Traceback (most recent call last)  in () ----> 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 

y este también :

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

con:

 --------------------------------------------------------------------------- TypeError Traceback (most recent call last)  in () ----> 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 

Por lo que entiendo, el segundo enfoque anterior (el primero que falla) debería funcionar. ¿Por qué falla?

tz_localize/tz_convert actúa sobre el ÍNDICE del objeto, no sobre los valores. Es más fácil simplemente convertirlo en un índice y luego localizarlo y convertirlo. Si desea volver a una serie, puede usar to_series()

 In [47]: pd.DatetimeIndex(pd.to_datetime(s,unit='ms')).tz_localize('UTC').tz_convert('US/Eastern') Out[47]:  [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 

Como menciona la respuesta de Jeff, tz_localize() y tz_convert() actúan sobre el índice, no sobre los datos. Esto también fue una gran sorpresa para mí.

Desde que se escribió la respuesta de Jeff, Pandas 0.15 agregó un nuevo accesorio Series.dt que ayuda a su caso de uso. Ahora puedes hacer esto:

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

este trabajo bien

 pd.to_datetime(my_series,unit='ms', utc=True).dt.tz_convert('US/Eastern')