Conversión de zonas horarias de pandas Marcas de tiempo

Tengo lo siguiente en un dataframe:

> df['timestamps'].loc[0] Timestamp('2014-09-02 20:24:00') 

Sé la zona horaria (creo que es GMT ) que utiliza y me gustaría convertir la columna completa a EST . ¿Cómo puedo hacer eso en Pandas?

Para referencia, encontré estos otros hilos:

  • Cambiar una marca de tiempo de Unix a una zona horaria diferente
  • Pandas: lea la marca de tiempo de CSV en GMT y luego vuelva a muestrear

pero funcionan con marcas de tiempo de datetime hora. P.ej:

 > datetime.datetime.fromtimestamp(df['timestamps'].loc[0], tz=None) returns: TypeError Traceback (most recent call last) ----> 2 datetime.datetime.fromtimestamp(ts, tz=None) TypeError: an integer is required (got type Timestamp) 

Solo usa el método tz_convert .

Digamos que tienes un objeto Timestamp:

  stamp = Timestamp('1/1/2014 16:20', tz='America/Sao_Paulo') new_stamp = stamp.tz_convert('US/Eastern') 

Si está interesado en convertir rangos de fechas:

  range = date_range('1/1/2014', '1/1/2015', freq='S', tz='America/Sao_Paulo') new_range = range.tz_convert('US/Eastern') 

Para grandes series de tiempo:

  import numpy as np ts = Series(np.random.randn(len(range)), range) new_ts = ts.tz_convert('US/Eastern') 

Como se indica en otra respuesta, si sus datos no tienen un conjunto de zona horaria, deberá tz_localize :

  data.tz_localize('utc') 

La marca de fecha y hora de datetime es en realidad de una marca de tiempo POSIX, es decir, ms de 1970-1-1 GMT

 In [11]: datetime.datetime.fromtimestamp? Type: builtin_function_or_method String form:  Docstring: timestamp[, tz] -> tz's local time from POSIX timestamp. In [12]: datetime.datetime.fromtimestamp(0) Out[12]: datetime.datetime(1969, 12, 31, 16, 0) In [13]: datetime.datetime.fromtimestamp(1) Out[13]: datetime.datetime(1969, 12, 31, 16, 0, 1) 

Creo que tal vez es un problema ya que estoy en la zona horaria de PST.

Esto es diferente de la marca de tiempo de los pandas (aunque bajo el capó que es ns desde 1970-1-1).

 In [21]: pd.Timestamp(0) Out[21]: Timestamp('1970-01-01 00:00:00') 

Para convertir una columna de marca de tiempo / datetime64, use tz_convert (si son tz ingenuos, es decir, no tiene una zona horaria todavía, primero deberá tz_localize):

 In [31]: pd.Timestamp(0).tz_localize('UTC') Out[31]: Timestamp('1970-01-01 00:00:00+0000', tz='UTC') In [32]: t = pd.Timestamp(0).tz_localize('UTC') In [33]: t.tz_convert('US/Eastern') Out[33]: Timestamp('1969-12-31 19:00:00-0500', tz='US/Eastern') 

Vea la sección de manejo de zona horaria de los documentos .