What I need to do

我有一个不支持时区的DateTime对象,我需要向其添加一个时区,以便能够将其与其他支持时区的DateTime对象进行比较.我不想在不知道这一遗留情况的情况下将我的整个应用程序转换为时区.

What I've Tried

首先,要演示问题:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes

首先,我try 使用时区:

>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>

这一失败并不令人惊讶,因为它实际上是在try 进行转换.更换似乎是更好的 Select (根据How do I get a value of datetime.today() in Python that is "timezone aware"?):

>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>> 

但正如您所看到的,replace似乎设置了tzinfo,但没有让对象意识到.我已经准备好在解析输入字符串之前对其进行修改,以获得一个时区(如果有必要的话,我将使用dateutil进行解析),但这似乎非常困难.

此外,我在Python2.6和Python2.7中都try 过这个方法,得到了相同的结果.

Context

我正在为一些数据文件编写解析器.我需要支持一种旧格式,其中日期字符串没有时区指示符.我已经修复了数据源,但仍然需要支持遗留数据格式.由于各种业务原因,一次性转换遗留数据不是一种 Select .虽然总的来说,我不喜欢硬编码默认时区的 idea ,但在这种情况下,它似乎是最好的 Select .我有充分的信心知道所有有问题的遗留数据都是UTC的,所以我准备接受在这种情况下违约的风险.

推荐答案

一般来说,要让一个简单的datetime时区知晓,请使用localize method:

import datetime
import pytz

unaware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0)
aware = datetime.datetime(2011, 8, 15, 8, 15, 12, 0, pytz.UTC)

now_aware = pytz.utc.localize(unaware)
assert aware == now_aware

对于UTC时区,实际上没有必要使用localize,因为没有夏令时计算来处理:

now_aware = unaware.replace(tzinfo=pytz.UTC)

作品(.replace返回一个新的日期时间;它不修改unaware.)

Python相关问答推荐

ValueRight:参数目标和输出必须具有相同的形状.接收:目标.形状=(无,512),输出.形状=(无,3)

FastAPI:使用APIRouter路由子模块功能

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

从webhook中的短代码(而不是电话号码)接收Twilio消息

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

带条件计算最小值

对于一个给定的数字,找出一个整数的最小和最大可能的和

可变参数数量的重载类型(args或kwargs)

用合并列替换现有列并重命名

Python中绕y轴曲线的旋转

pyscript中的压痕问题

海上重叠直方图

Pandas—在数据透视表中占总数的百分比

如何在UserSerializer中添加显式字段?

未知依赖项pin—1阻止conda安装""

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

Django RawSQL注释字段

Python逻辑操作作为Pandas中的条件

isinstance()在使用dill.dump和dill.load后,对列表中包含的对象失败