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 中将感知本地日期时间转换为天真的本地日期时间