如何使用Python将UTC转换为EST并自动处理夏令时?

时间:2018-01-24 06:57:16

标签: python datetime datetime-format python-datetime

如果我有一堆数据与日期& UTC format中的时间,如何将它们转换为EST

它可以确定每年自动-4(in summer)和 - 5(in winter)的时间? 感谢

4 个答案:

答案 0 :(得分:5)

您需要使用pytz模块(可从PyPI获得):

import pytz
from datetime import datetime

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

winter = datetime(2016, 1, 24, 18, 0, 0, tzinfo=utc)
summer = datetime(2016, 7, 24, 18, 0, 0, tzinfo=utc)

print winter.strftime(fmt)
print summer.strftime(fmt)

print winter.astimezone(est).strftime(fmt)
print summer.astimezone(est).strftime(fmt)

将打印:

2016-01-24 18:00:00 UTC+0000
2016-07-24 18:00:00 UTC+0000
2016-01-24 13:00:00 EST-0500
2016-07-24 14:00:00 EDT-0400

在最后两行输出中举例说明了您需要使用'US/Eastern'而不是'EST'的原因。

答案 1 :(得分:1)

如上所述,您可以像这样使用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对象中删除时区信息,因此您只能操作日期和时间(不用担心,不会再次更改时区,它只是将其从时间戳中剥离了字符串)。

答案 2 :(得分:0)

如果您有一个对象数据类型为熊猫的系列,则可以先使用pd.to_datetime()

将其转换为DateTime系列。
df[col] = pd.to_datetime(your_series, format = '%Y-%m-%d %H:%M:%S', errors ='coerce')

通过使用series.dt.tz

检查是否知道时区
df[col].dt.tz

如果它不支持时区,则应使用series.dt.tz_localize()使其变为时区。另外,请阅读有关此函数的模棱两可和不存在的参数

df[col] = your_series[col].dt.tz_localize('UTC')

现在通过series.dt.tz_convert()

将此系列转换为所需的时区
df[col] = your_series[col].dt.tz_convert('US/Eastern')

以上方法将节省夏令时。如果要检查更多时区,可以点安装pytz和

import pytz
pytz.common_timezones

答案 3 :(得分:0)

如果您只想为现有的timedelta偏移量归一化小时:

from datetime import datetime
import pytz

def curr_est_offset():
    tz_est = pytz.timezone('US/Eastern')
    offset = tz_est.utcoffset(datetime.utcnow())
    offset_seconds = (offset.days * 86400) + offset.seconds
    offset_hours = offset_seconds // 3600

    return offset_hours # -4 or -5