首页 > 解决方案 > 时区偏移超出范围的不一致 ValueError

问题描述

时间戳的时区偏移部分必须介于 -12 和 +14 小时之间。否则就是无稽之谈。我正在处理 pandas 数据帧广告中的时间戳字符串字段,因为偏移超出了 -12 + 14 小时边界,因此我的一些时间戳是荒谬的。

一个好的时间戳:

good = '2019-11-11T07:08:09.640-4:00'

错误的时区偏移

bad = '2019-11-19T22:51:34.619000+17:00'

另一个糟糕的时区偏移:

bad2 = '2019-11-11T07:08:09.640-31:00'

现在,如果我尝试将这些字符串转换为 isoformat:

按预期工作:

import dateutil
dateutil.parser.parse(good).isoformat()
'2019-11-11T07:08:09.640000-04:00'

不按预期工作,返回时间戳:

dateutil.parser.parse(bad).isoformat()
'2019-11-19T22:51:34.619000+17:00'

按预期工作,我收到一条错误消息(我随后可以在 if else、try、catch 块中使用它)

dateutil.parser.parse(bad2).isoformat()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: offset must be a timedelta strictly between -timedelta(hours=24) and timedelta(hours=24).

为什么当它们都超出时区偏移时,我会在 bad2 上收到错误消息并且还不错

标签: pythondataframepython-dateutil

解决方案


这只是 Python 中时区偏移的界限 - 如错误消息中所述,偏移的界限最多为 ±24h,这与您的发现一致。它与实时时区中当前的最大和最小偏移量无关,除了如果边界不允许表示所有实时时区,这将是一个问题。

没有简单的方法可以让 datetime 或 dateutil 以您想要的方式失败,因为边界不可配置。如果您想检测 +14/-12 之外的偏移量或任何任意限制,则需要检查utcoffset,如下所示:

if not (timedelta(hours=-12) < dt.utcoffset() < timedelta(hours=14)):
    raise ValueError(...)

也就是说,除非您知道您的某些字符串具有这种特定的错误模式,否则我不推荐这种做法。在处理日期时间和时区时,您将学到的一件事是,对它们施加任意限制很少是一个好主意,因为某个地方的某个随机国家会决定制定一条违反您简洁的“实际”限制的规则。我什至对 tzinfo 中的 ±24h 偏移限制持谨慎态度,但这是语言中内置的,至少短期内真正的偏移不太可能违反它。


推荐阅读