astimezone() 不能应用于天真的日期时间

Posted

技术标签:

【中文标题】astimezone() 不能应用于天真的日期时间【英文标题】:astimezone() cannot be applied to a naive datetime 【发布时间】:2013-11-15 09:18:15 【问题描述】:

timezones() 和 datetimes 是否可能在时间等方面与我的操作系统发生冲突?

起初这是一个愚蠢的问题,因为我遇到了这个问题,但我看不出它为什么或从哪里发生。

期待这个:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return datetime.astimezone(parser.parse(a_datetime), tz)

这个函数应该返回一个不错的 datetime 对象作为 timezone(),就是它!但是不要!

我只知道我收到了这条消息:astimezone() 不能应用于一个幼稚的 datetime()

由于我有朋友使用相同的功能,并且在他们的 PC 中代码运行正常,但在我的情况下没有。

推测是:你机器里的配置有问题……但是,不确定。

如果还有其他人面临这个问题并且知道它只是阅读这里的内容,那么如果你告诉我会很好,我会很高兴。提前致谢!

【问题讨论】:

您的示例代码中的datetime 是模块还是datetime.datetime 类? 是的!一切看起来都很好。我的意思是,所需的一切都导入到示例代码中。 否,datetime 未在您的示例代码中定义(用于最后一行)。 【参考方案1】:

您使用错误的方法将时区附加到 datetime 对象。

正如pytz page 中所记录的,您希望datetime 对象上调用该方法,而不是在类上:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return parser.parse(a_datetime).astimezone(tz)

这仅适用于已经本地化的datetime 对象(例如,UTC 作为时区)。

正如同一文档指出的那样,您最好在时区对象上使用.localize() 方法:

def parse_datetime(a_datetime, account):
    tz = pytz.timezone(account.timezone_name)
    return tz.localize(parser.parse(a_datetime))

这适用于幼稚的 datetime 对象,并且对于具有历史数据的时区也适用。

如果您有混合数据,有些有时区,有些没有时区,那么您应该测试已经存在的时区:

def parse_datetime(a_datetime, account):
    dt = parser.parse(a_datetime)
    if dt.tzinfo is None:
        tz = pytz.timezone(account.timezone_name)
        dt = tz.localize(dt)
    return dt

已附加时区的时间戳将生成可识别时区的 datetime 对象,无需重新转换为另一个时区。

【讨论】:

我更改了您显示的代码,但它仍然给出: astimezone() 不能应用于幼稚的日期时间 @MartijinPieters,我真的很高兴你能帮我解决这个问题,但这个案例很奇怪。确实与我的PC idk有关!函数的返回是这样的: 2013-11-01T23:00:00+00:00 最后可以看到 00+00:00 (应该不是这样)。 @Doug:这是日期时间对象的字符串表示形式。 一切正常 在最后一次修改代码之后,它得到了相同的ExceptionType:ValueError,现在消息变为:Not naive datetime (tzinfo is already set) @Doug:一些你的输入有一个时区作为解析字符串的一部分。

以上是关于astimezone() 不能应用于天真的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间

抑制 django 天真的日期时间警告

Django:查询时的天真日期时间

RuntimeWarning:DateTimeField 收到一个天真的日期时间

在时区支持处于活动状态时收到一个天真的日期时间

Freezegun 总是导致 RuntimeWarning 收到天真的日期时间