时区转换从 UTC 到新时区

Posted

技术标签:

【中文标题】时区转换从 UTC 到新时区【英文标题】:Timezone Conversion From UTC to new time zone 【发布时间】:2016-10-10 19:25:55 【问题描述】:

我在 python 中将 UTC 转换为新时区时遇到了很多麻烦。

数据原本是一个带进来的字符串,并成功转换为UTC,如下:

df['order delivery time'] = pd.to_datetime(df['order delivery time'])

接下来我尝试写一个这样的函数:

eastern = pytz.timezone('US/Eastern')
central = pytz.timezone('US/Central')
pacific = pytz.timezone('US/Pacific')

def change_tz(time, region):
    if region == 'sf':
        return time.astimezone(pytz.timezone(pacific))
    elif region == 'chi':
        return time.astimezone(pytz.timezone(central))
    elif region == 'nyc':
        return time.astimezone(pytz.timezone(eastern))

然后申请:

 df['order delivery time ADJUSTED'] = df.apply(lambda row: change_tz(row['order delivery time'], row['region']), axis=1)

我收到此错误:

 AttributeError: ("'US/Central' object has no attribute 'upper'", u'occurred at index 0')

我也试过这样的行:

 if region == 'sf':
      return datetime.fromtimestamp(time, tz='US/Pacific')

还有:

 if region == 'sf':
      return tz.fromutc(datetime.utcfromtimestamp(time).replace(tzinfo='US/Pacific'))

请帮我转换时区!谢谢!

【问题讨论】:

【参考方案1】:

我过去曾成功使用 pytz 和 dateutil.parser:

import pytz
import dateutil.parser

date_needed = dateutil.parser.parse(request.POST.get("date_needed"))
item.date_needed = pytz.timezone("America/Phoenix").localize(date_needed, is_dst=None)

【讨论】:

【参考方案2】:

AttributeError: ("'US/Central' 对象没有属性 'upper'", u'发生在索引 0')

central 已经是 pytz.timezone 对象。不要将它传递给pytz.timezone()——直接使用它。

尚不清楚在您的情况下 time 变量是什么 (type(time))。

如果time 是一个代表 Unix 时间的浮点数,那么您可以使用以下方法在给定时区中获取对应的时区感知日期时间对象:

from datetime import datetime

dt = datetime.fromtimestamp(unix_time, central)

如果time 已经是一个timezone-aware 表示UTC 时间的日期时间对象,则将其转换为给定时区:

dt = dt_utc.astimezone(central)

您可以使用tz_convert() 方法转换pandas 对象以将tz-aware 数据转换为另一个时区:

ts_utc.tz_convert(central)

【讨论】:

以上是关于时区转换从 UTC 到新时区的主要内容,如果未能解决你的问题,请参考以下文章

python / pytz问题从本地时区转换为UTC然后返回

从当前时区转换为 UTC 是不正确的 swift [重复]

将 Postgres 中没有时区的 DateTime 字段从中欧时间转换为 UTC

Redshift - 将 UTC 数据转换为其他时区

将时区从时间戳列转换为各种时区

将 PDT/PST 时区列转换为 UTC 时区