Как конвертировать EST в местное время с помощью Dataframe - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь преобразовать метки времени в EST в различные локализованные метки времени в кадре данных pandas.У меня есть дата-фрейм с метками времени в EST и часовым поясом, в который они должны быть конвертированы.

Я знаю, что уже есть несколько тем на подобные темы.Однако они либо начинаются в UTC, либо я не могу выполнить репликацию с моими данными.

Перед записью я проконсультировался: Как преобразовать время по Гринвичу в время по EST, используя python

Я импортировал данные:

import pandas
import datetime as dt
import pytz 

transaction_timestamp_est         local_timezone

2013-05-28 05:18:00+00:00         America/Chicago
2013-06-12 05:23:20+00:00         America/Los_Angeles
2014-06-21 05:26:26+00:00         America/New_York

Я преобразовал в datetime и создал следующую функцию:

df.transaction_timestamp_est = 
pd.to_datetime(df.transaction_timestamp_est)


def db_time_to_local(row):

    db_tz = pytz.timezone('America/New_York')
    local_tz = pytz.timezone(row['local_timezone'])

    db_date = db_tz.localize(row['transaction_timestamp_est'])
    local_date = db_date.astimezone(local_tz)

    return local_date

Я запускаю ее здесь:

df['local_timestamp'] = df.apply(db_time_to_local, axis=1)

И получаюэта ошибка:

ValueError: ('Не наивная дата / время (tzinfo уже установлена)', 'произошла с индексом 0')

Я ожидаю новый столбец вФрейм данных с именем local_timestamp имеет временную метку, настроенную в соответствии с данными в столбце local_timezone.

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Ошибка, которую вы видите, выглядит так, потому что вы пытаетесь локализовать временную метку с поддержкой tz. '+00:00' в ваших отметках времени указывает на то, что они поддерживают tz в UTC (или что-то в этом роде).

Некоторая терминология: наивная дата / время не имеет понятия о часовом поясе, а tz-осведомленная (или локализованная) ассоциируется с конкретным часовым поясом. Локализация относится к преобразованию tz-наивной даты / времени в tz-осведомленную. По определению вы не можете локализовать дату / время с поддержкой tz: вы либо конвертируете их в наивные, а затем локализуете, либо конвертируете напрямую в целевой часовой пояс.

Чтобы получить этот столбец в EST, преобразуйте его в наивный, а затем локализуйте в EST:

In [98]: df['transaction_timestamp_est'] = df['transaction_timestamp_est'].dt.tz_localize(None).dt.tz_localize('EST') 
In [99]: df
Out [99]:

0   2013-05-28 05:18:00-05:00
1   2013-06-12 05:23:20-05:00
2   2014-06-21 05:26:26-05:00
Name: transaction_timestamp_est, dtype: datetime64[ns, EST]

Обратите внимание на 'EST' в dtype. Затем вы можете преобразовать каждую временную метку в ее целевой часовой пояс:

In [100]: df['local_ts'] = df.apply(lambda x: x[0].tz_convert(x[1]), axis=1)                                        

In [101]: df                                                                                                        
Out[101]: 
  transaction_timestamp_est       local_timezone                   local_ts
0 2013-05-28 05:18:00-05:00      America/Chicago  2013-05-28 05:18:00-05:00
1 2013-06-12 05:23:20-05:00  America/Los_Angeles  2013-06-12 03:23:20-07:00
2 2014-06-21 05:26:26-05:00     America/New_York  2014-06-21 06:26:26-04:00

Для пояснения: каждый элемент в первом столбце имеет тип pd.Timestamp . Его метод tz_convert() меняет свой часовой пояс, переводя дату / время в новую зону.

В результате получается столбец pd.Timestamps со смесью часовых поясов, с которым трудно справиться в пандах. Большинство (возможно, все) функции панд, которые работают со столбцами даты / времени, требуют, чтобы весь столбец имел одинаковый часовой пояс.

Если хотите, конвертировать в tz-naive:

In [102]: df['local_ts'] = df.apply(lambda x: x[0].tz_convert(x[1]).tz_convert(None), axis=1)                                                      

In [103]: df                                                                                                                                       
Out[103]: 
  transaction_timestamp_est       local_timezone            local_ts
0 2013-05-28 05:18:00-05:00      America/Chicago 2013-05-28 10:18:00
1 2013-06-12 05:23:20-05:00  America/Los_Angeles 2013-06-12 10:23:20
2 2014-06-21 05:26:26-05:00     America/New_York 2014-06-21 10:26:26

Если ваши данные позволяют, лучше постараться сохранить столбцы меток времени (или индексов) в одном часовом поясе. UTC обычно лучше, так как в нем нет переходов DST или других проблем, которые могут привести к отсутствию / неоднозначности времени, как это делают большинство других часовых поясов.

0 голосов
/ 29 мая 2019
from datetime import datetime, time, date
from pytz import timezone, utc

tz = timezone("Asia/Dubai")
d = datetime.fromtimestamp(1426017600,tz)
print d
midnight = tz.localize(datetime.combine(date(d.year, d.month, d.day),time(0,0)), is_dst=None)
print int((midnight - datetime(1970, 1, 1, tzinfo=utc)).total_seconds())

На основе кода из python - дата и время с часовым поясом до эпохи

...