如何将EST / EDT兑换成GMT?

时间:2011-03-30 19:30:02

标签: python gmt

我在列中有一些代表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
...

有人可以帮助我吗?感谢

6 个答案:

答案 0 :(得分:12)

我知道在时区之间进行转换的最简单,最可靠的方法是使用第三方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,  是不存在的。见this link 讨论在处理当地时间时出现的这些甚至更奇怪的问题。

如果您愿意忽略这些棘手的角落情况,并且您的机器是在当地时区设置的(例如EST / EDT), 有一种方法可以在本地和UTC时区之间进行转换 不需要安装pytz。想法是转换日期时间 - > timetuple - >时间戳 - > UTC日期时间。转换链是用

完成的
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),这里是如何将表示本地时间的datetime对象转换为表示GMT的datetime对象 时间,反之亦然:

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)

答案 1 :(得分:2)

每条记录的伪代码:

制作时间戳字符串:field [0] .strip()+“”+ field [1] .strip()

使用datetime.datetime.strptime()将其转换为datetime.datetime实例

添加timedelta,例如timedelta(小时= -4)到你的时间戳

使用timestamp.strftime()生成输出所需的任何字符串表示。

对于时间字段为空的情况:如果这意味着0:0:0,请修改上述内容以适应。如果它意味着“时间未知”,你将需要做其他的事情......

答案 2 :(得分:1)

没有相关时间,时区无关紧要......也不能将日期转换为其他时区。另一栏中是否有相关时间?

编辑:好吧,既然有一段时间,我会让蟒蛇大师接管。 ]

答案 3 :(得分:1)

我必须在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的支持。目前是二月,美国东部时间正在跟进。欢迎任何更改或更正!

答案 4 :(得分:0)

假设我们在美国/东部时间的日期时间字符串为“ 2019-04-09T23:59:55ET”。 这是将字符串转换为UTC的函数:

[19-04-04 16:37:07.447] Build failed. Command xcodebuild failed with exit code 70 Error output: 
 2019-04-04 16:37:06.017 xcodebuild[68104:596846] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/0v/034z5q516y3gg8_z75hbm6sm0000gn/T/MyApp_2019-04-04_16-37-06.017.xcdistributionlogs'.
error: exportArchive: "MyApp.app" requires a provisioning profile.
Error Domain=IDEProvisioningErrorDomain Code=9 ""MyApp.app" requires a provisioning profile." UserInfo={NSLocalizedDescription="MyApp.app" requires a provisioning profile., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
OUTPUT 1

答案 5 :(得分:0)

您可以像这样使用pandas.DataFrame.tz_convert()

import pandas as pd
from datetime import datetime

df = pd.read_csv("your_data_file_path.csv", index_col=False, engine='python')
df['Date'] = pd.to_datetime(df['Date'])
df['Date'] = df['Date'].dt.tz_localize('US/Eastern').dt.tz_convert('UTC')
df['Date'] = df['Date'].apply(lambda x: datetime.replace(x, tzinfo=None))

最后一行所做的是从datetime对象中删除时区信息,因此您只能操作日期和时间(不用担心,不会再次更改时区,它只是将其从时间戳中剥离了字符串)。