Преобразование временных интервалов из pandas Временные метки

В кадре данных есть следующее:

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

Я знаю часовой пояс (я думаю, что это GMT), который он использует, и хотел бы преобразовать весь столбец в EST. Как это сделать в Pandas?

Для справки я нашел эти другие потоки:

но они работают с отметками времени datetime. Например:.

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

Ответ 1

Просто используйте метод tz_convert.

Допустим, у вас есть объект Timestamp:

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

Если вы заинтересованы в преобразовании диапазонов дат:

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

Для больших временных рядов:

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

Как указано в другом ответе, если ваши данные не имеют установленного часового пояса, вам нужно tz_localize it:

   data.tz_localize('utc')

Ответ 2

datetime fromtimestamp на самом деле из метки времени POSIX, т.е. от 1970-1-1 GMT

In [11]: datetime.datetime.fromtimestamp?
Type:        builtin_function_or_method
String form: <built-in method fromtimestamp of type object at 0x101d90500>
Docstring:   timestamp[, tz] -> tz 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)

Я думаю, может быть, это проблема, поскольку я нахожусь в часовом поясе PST.

Это отличается от pandas Timestamp (хотя под капотом, который находится в ns от 1970-1-1).

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

Для преобразования столбца Timestamp/datetime64 используйте tz_convert (если tz naive, т.е. не имеют часового пояса, вам сначала нужно будет 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')

Смотрите раздел раздел обработки часовых поясов.