时区偏移超出范围的ValueError不一致

时间:2019-12-23 00:06:10

标签: python dataframe python-dateutil

时间戳记的时区偏移部分必须介于-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中尝试使用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和不坏消息上得到一条错误消息

1 个答案:

答案 0 :(得分:2)

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

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

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

也就是说,除非您知道某些字符串具有这种特定的错误模式,否则我不建议您采取这种行动。您将学到的处理日期时间和时区的一件事是,对它们进行任意限制很少是一个好主意,因为某个地方的某个随机国家会决定制定一条违反您整洁的“实际”限制的规则。我什至对tzinfo中的±24h偏移量限制保持警惕,但这是语言内置的功能,至少不可能在不久的将来出现真正的偏移量。