python - 时区偏移超出范围的不一致 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 上收到错误消息并且还不错
解决方案
这只是 Python 中时区偏移的界限 - 如错误消息中所述,偏移的界限最多为 ±24h,这与您的发现一致。它与实时时区中当前的最大和最小偏移量无关,除了如果边界不允许表示所有实时时区,这将是一个问题。
没有简单的方法可以让 datetime 或 dateutil 以您想要的方式失败,因为边界不可配置。如果您想检测 +14/-12 之外的偏移量或任何任意限制,则需要检查utcoffset
,如下所示:
if not (timedelta(hours=-12) < dt.utcoffset() < timedelta(hours=14)):
raise ValueError(...)
也就是说,除非您知道您的某些字符串具有这种特定的错误模式,否则我不推荐这种做法。在处理日期时间和时区时,您将学到的一件事是,对它们施加任意限制很少是一个好主意,因为某个地方的某个随机国家会决定制定一条违反您简洁的“实际”限制的规则。我什至对 tzinfo 中的 ±24h 偏移限制持谨慎态度,但这是语言中内置的,至少短期内真正的偏移不太可能违反它。
推荐阅读
- mongodb - Loopback/mongodb:查找所有共享某项技能的工作
- python - 合并其中一列或另一列中缺少数据的数据框
- codeigniter - codeignite 3. 相同的 url 为单个项目中的相同键设置不同的配置值
- java-8 - Java中不同对象之间的关系
- c# - 如何从 Azure AD 获取 TokenCredentials 的访问令牌?
- oauth-2.0 - AWS Amplify SPA React + Cognito(已启用 Microsoft Azure Ad Enterprise SSO)+ Microsoft Graph API
- java - Selenium getAttribute(href) 使用 java - Salesforce 应用程序返回空值
- ios - 问题:TMS-90809:不推荐使用 API - Apple 将停止接受使用 UIWebView API 的应用提交
- python - metrics.r2_score 和 acccuracy_score 有什么区别
- javascript - How to add read less button on my code after click on read more?