Как конвертировать EST / EDT в GMT? - PullRequest
6 голосов
/ 30 марта 2011

У меня есть несколько записей внутри столбца, которые представляют время EST или EDT. Мне нужно преобразовать это время в GMT. Формат времени:

10/1/2010   0:0:0
10/1/2010   0:6:0
...
10/1/2010   23:54:0
...
10/3/2010   0:0:0
...

Может кто-нибудь помочь мне здесь? спасибо

Ответы [ 5 ]

12 голосов
/ 31 марта 2011

Самый простой и надежный способ преобразования часовых поясов, который я знаю, - это использовать сторонний модуль pytz :

import pytz
import datetime as dt

utc=pytz.utc
eastern=pytz.timezone('US/Eastern')
fmt='%Y-%m-%d %H:%M:%S %Z%z'

text='''\
10/1/2010   0:0:0
10/1/2010   0:6:0
10/1/2010   23:54:0
10/3/2010   0:0:0
'''

for datestring in text.splitlines():
    date=dt.datetime.strptime(datestring,"%m/%d/%Y %H:%M:%S")
    date_eastern=eastern.localize(date,is_dst=None)
    date_utc=date_eastern.astimezone(utc)
    print(date_utc.strftime(fmt))

Выходы:

2010-10-01 04:00:00 UTC+0000
2010-10-01 04:06:00 UTC+0000
2010-10-02 03:54:00 UTC+0000
2010-10-03 04:00:00 UTC+0000

Обратите внимание, однако, что ваши данные не указывают, находится ли дата и время в часовом поясе EST или EDT. Есть некоторые моменты, которые неоднозначны, когда вы не указываете EST или EDT. Например, «10/27/2002 1:30:00» будет неоднозначным:

>>> eastern.localize(datetime(2002, 10, 27, 1, 30, 00), is_dst=None)
AmbiguousTimeError: 2002-10-27 01:30:00

, поскольку это время произошло дважды из-за перехода на летнее время. Также некоторые даты, такие как 2002-04-07 02:30:00, не существует. Смотрите эту ссылку для обсуждения этих и даже более странных вопросов, возникающих при работе с местным временем.

Если вы хотите пропустить эти запутанные угловые случаи, и если ваша машина настроена в местном часовом поясе (например, EST / EDT), есть способ конвертировать между местным и часовым поясом UTC, который делает не требует установки pytz. Идея состоит в том, чтобы преобразовать datetime -> timetuple -> timestamp -> UTC datetime. Цепочка преобразований сделана с

dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))

Например:

import time
import datetime as dt
import pytz

utc=pytz.utc
eastern=pytz.timezone('US/Eastern')
fmt='%Y-%m-%d %H:%M:%S %Z%z'

text='''\
10/1/2010   0:0:0
10/1/2010   0:6:0
10/1/2010   23:54:0
10/3/2010   0:0:0
3/13/2011   1:55:0
3/13/2011   3:00:0
'''
for datestring in text.splitlines():
    date=dt.datetime.strptime(datestring,"%m/%d/%Y %H:%M:%S")
    date_est=eastern.localize(date,is_dst=None)
    date_utc=date_est.astimezone(utc)
    date_utc2=dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))
    print('{d} --> {d_utc}    {d_utc2}'.format(
        d=date.strftime(fmt),
        d_utc=date_utc.strftime(fmt),
        d_utc2=date_utc2.strftime(fmt),
        ))
    assert date_utc.hour == date_utc2.hour

выходы

2010-10-01 00:00:00 EDT-0400 --> 2010-10-01 04:00:00 UTC+0000    2010-10-01 04:00:00 
2010-10-01 00:06:00 EDT-0400 --> 2010-10-01 04:06:00 UTC+0000    2010-10-01 04:06:00 
2010-10-01 23:54:00 EDT-0400 --> 2010-10-02 03:54:00 UTC+0000    2010-10-02 03:54:00 
2010-10-03 00:00:00 EDT-0400 --> 2010-10-03 04:00:00 UTC+0000    2010-10-03 04:00:00 
2011-03-13 01:55:00 EST-0500 --> 2011-03-13 06:55:00 UTC+0000    2011-03-13 06:55:00 
2011-03-13 03:00:00 EDT-0400 --> 2011-03-13 07:00:00 UTC+0000    2011-03-13 07:00:00 

Последние две даты, проверенные выше, показывают, что преобразование работает корректно даже при временах, близких к переключению между EST и EDT.


В итоге, используя альтернативный метод (без pytz), здесь показано, как преобразовать объекты даты и времени, представляющие локальное время, в объекты даты и времени, представляющие GMT время и наоборот:

In [83]: import datetime as dt
In [84]: import time
In [85]: import calendar

In [86]: date=dt.datetime(2010,12,1,0,0,0)    
In [87]: date
Out[87]: datetime.datetime(2010, 12, 1, 0, 0)

In [88]: date_utc=dt.datetime.utcfromtimestamp(time.mktime(date.timetuple()))    
In [89]: date_utc
Out[89]: datetime.datetime(2010, 12, 1, 5, 0)

In [90]: date_local=dt.datetime.fromtimestamp(calendar.timegm(date_utc.timetuple()))    
In [91]: date_local
Out[91]: datetime.datetime(2010, 12, 1, 0, 0)
2 голосов
/ 31 марта 2011

Псевдокод для каждой записи:

создать строку метки времени: поле [0] .strip () + "" + поле [1] .strip ()

используйте datetime.datetime.strptime (), чтобы преобразовать это в экземпляр datetime.datetime

добавить временную шкалу, например, timedelta (часы = -4) к вашей отметке времени

используйте timestamp.strftime () для создания любого строкового представления, которое вы хотите для вывода.

Для случая, когда поле времени пусто: Если это означает 0: 0: 0, измените приведенное выше в соответствии с. Если это означает «время неизвестно», вам нужно будет заняться чем-то другим ...

1 голос
/ 14 февраля 2014

Мне пришлось создать пользовательскую функцию в Python для преобразования EST в GMT, вот код, который я написал:

#convert est time to gmt. Make sure you assign the current EST values
#to the following variables
        est_year
        est_month
        est_day
        est_hour
        est_min

        gmt_year = est_year
        gmt_month = est_month
        gmt_day = est_day
        gmt_hour = est_hour + 5 #gmt is ahead by 5 hrs
        gmt_min = est_min

        if gmt_hour > 23:
          gmt_hour = gmt_hour - 23
          gmt_day = est_day + 1

        days_in_month = calendar.monthrange(est_year,est_month)[1] #in case the no days becomes 32..

        if gmt_day > days_in_month:
          gmt_day = 1
          gmt_month = gmt_month + 1

        if gmt_month > 12:
          gmt_month = 1
          gmt_year = gmt_year + 1

        gmttime = datetime.datetime(gmt_year, gmt_month, gmt_day, gmt_hour, gmt_min, 0)

Я не добавил поддержку EDT. Сейчас февраль, и EST соблюдается. Любые изменения или исправления приветствуются!

1 голос
/ 30 марта 2011

Без соответствующего времени часовой пояс не имеет значения ... и дата не может быть переведена в другой часовой пояс.Есть ли связанное время в другом столбце?

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда есть время, я позволю гуру питона вступить во владение.;]

0 голосов
/ 04 апреля 2019

Предположим, что у нас есть строка даты и времени как "2019-04-09T23: 59: 55ET" в американском / восточном времени. Вот функция преобразования строки в UTC:

from datetime import datetime
import pytz

eastern = pytz.timezone('US/Eastern')

def convent_est_to_utc(datetime_str):
    dt = datetime.strptime(datetime_str, '%Y-%m-%dT%H:%M:%SET')
    return dt.replace(tzinfo=eastern).astimezone(pytz.utc)

# testing
convent_est_to_utc("2019-04-09T23:59:55ET")

# The result: 2019-04-10 04:55:55+00:00

...