跳转到主要内容

ISO 8601持续时间的操作

项目描述

isoduration: ISO 8601持续时间的操作。

PyPI Package

这是什么。

ISO 8601最知名的是一种在文本格式中交换日期时间的格式。标准中较少为人所知的一个方面是持续时间的表示。它们的形状类似于以下

P3Y6M4DT12H30M5S

这个字符串表示3年6个月4天12小时30分钟和5秒的持续时间。

Python中ISO 8601持续时间处理的最新技术大致限于isodate提供的内容。我们在这里试图解决isodate的不足(如他们在自己的限制部分所述),以及我们对他们接口的一些烦恼,例如在处理类型方面的缺乏一致性,以及使用正则表达式进行解析。

如何使用它。

此软件包围绕Duration类型。

给定一个ISO持续时间字符串,我们可以通过使用parse_duration()函数来生成此类类型

>>> from isoduration import parse_duration
>>> duration = parse_duration("P3Y6M4DT12H30M5S")
>>> duration.date
DateDuration(years=Decimal('3'), months=Decimal('6'), days=Decimal('4'), weeks=Decimal('0'))
>>> duration.time
TimeDuration(hours=Decimal('12'), minutes=Decimal('30'), seconds=Decimal('5'))

解析出的持续时间中的 datetime 部分只是普通的 dataclass,因此它们的成员可以通过非令人惊讶的方式访问。

除了解析之外,还有许多其他操作可用

  • 持续时间可以进行比较和取反
    >>> parse_duration("P3Y4D") == parse_duration("P3Y4DT0H")
    True
    >>> -parse_duration("P3Y4D")
    Duration(DateDuration(years=Decimal('-3'), months=Decimal('0'), days=Decimal('-4'), weeks=Decimal('0')), TimeDuration(hours=Decimal('0'), minutes=Decimal('0'), seconds=Decimal('0')))
    
  • 持续时间可以与 Python 日期时间相加或相减
    >>> from datetime import datetime
    >>> datetime(2020, 3, 15) + parse_duration("P2Y")
    datetime.datetime(2022, 3, 15, 0, 0)
    >>> datetime(2020, 3, 15) - parse_duration("P33Y1M4D")
    datetime.datetime(1987, 2, 11, 0, 0)
    
  • 持续时间是可散列的,因此可以用作字典键或集合的一部分。
  • 可以将持续时间格式化为符合 ISO 8601 的持续时间字符串
    >>> from isoduration import parse_duration, format_duration
    >>> format_duration(parse_duration("P11YT2H"))
    'P11YT2H'
    >>> str(parse_duration("P11YT2H"))
    'P11YT2H'
    

如何改进它。

按照这个顺序进行这些步骤,应该能让你进入开发环境

git clone git@github.com:bolsote/isoduration.git
cd isoduration/
python -m venv ve
. ve/bin/activate
pip install -U pip
pip install -e .
pip install -r requirements/dev.txt

根据您自己的喜好和/或需求进行调整。

测试由 tox 驱动。运行 tox -l 的输出以及仔细阅读 tox.ini 应该能帮助你。

常见问题解答。

为什么 P1Y != P365D?

有些年份有 366 天。如果它们不是总是相同的,那么它们就不是相同的。

为什么您要创建自己的类型,而不是稍微勉强使用一个 timedelta?

timedelta 无法表示某些持续时间,例如涉及年份或月份的持续时间。由于它不能在不进行危险算术的情况下表示所有可能的持续时间,因此它不是正确的类型。

为什么您不使用正则表达式来解析持续时间字符串?

正则表达式仅应用于解析正则语言。

为什么解析是格式化的逆过程,但反之则不成立?

因为这个美妙的表现不是唯一的。

为什么您支持 <插入一个奇怪的情况>

可能是因为标准让我这样做。

为什么您不支持 <插入一个奇怪的情况>

可能是因为标准不允许我这样做。

为什么不能从持续时间中减去一个日期时间?

我感到困惑。

为什么我应该使用这个而不是其他东西?

你不应该做互联网上的人告诉你的事情。

为什么 ISO 标准如此奇怪?

是的。

参考。

  • XML Schema Part 2: Datatypes, Appendix D:这个令人兴奋命名的文档包含了比任何人都应该理解得更多关于 ISO 8601 的细节。
  • isodate:Python 中 ISO 持续时间的原始实现。值得一探究竟。但我们的更酷。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

isoduration-20.11.0.tar.gz (11.6 kB 查看散列)

上传时间 源代码

构建分发

isoduration-20.11.0-py3-none-any.whl (11.3 kB 查看散列)

上传时间 Python 3