翼度科技»论坛 编程开发 python 查看内容

超越datetime:Arrow,Python中的日期时间管理大师

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
介绍

Arrow是一个Python库,它提供了一种合理且对人类友好的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现了对datetime类型的更新,填补了功能上的空白,提供了一个智能的模块API,支持许多常见的创建场景。简单来说,它可以帮助您使用更少的导入和更少的代码来处理日期和时间。
Arrow以时间之箭命名,并且受到moment.js和requests的极大启发。
为什么要使用Arrow而不是内置模块?

Python的标准库和其他一些低级模块拥有近乎完整的日期、时间和时区功能,但从可用性的角度来看,它们的工作效果并不理想:

  • 模块太多:datetime, time, calendar, dateutil, pytz等
  • 类型太多:date, time, datetime, tzinfo, timedelta, relativedelta等
  • 时区和时间戳转换冗长且不愉快
  • 通常情况下都是时区不敏感的
  • 功能上存在gap:ISO 8601支持、时区间隔支持、不够人性化
特性


  • 完全实现的,可替代datetime
  • 支持Python 3.6+
  • 默认支持时区感知和UTC
  • 为许多常见输入场景提供超简单的创建选项
  • shift方法支持相对偏移,包括周
  • 自动格式化和解析字符串
  • 广泛支持ISO 8601标准
  • 时区转换
  • 支持dateutil, pytz和ZoneInfo tzinfo对象
  • 生成时间段、范围、下限和上限,适用于从微秒到年的时间框架
  • 使用不断增长的贡献语言环境人性化日期和时间
  • 可扩展为您自己的Arrow派生类型
  • 全面支持PEP 484风格的类型提示
快速开始

安装

使用 pip or pipenv:
  1. pip install -U arrow
复制代码
简单使用
  1. >>> import arrow
  2. >>> arrow.get('2024-06-13T17:23:58.970460+08:00')
  3. <Arrow [2024-06-13T17:23:58.970460+08:00]>
  4. >>> utc = arrow.utcnow()
  5. >>> utc
  6. <Arrow [2024-06-13T08:37:39.950050+00:00]>
  7. >>> utc = utc.shift(hours=-1)
  8. >>> utc
  9. <Arrow [2024-06-13T07:37:39.950050+00:00]>
  10. >>> local = utc.to('Asia/Shanghai')
  11. >>> local
  12. <Arrow [2024-06-13T15:37:39.950050+08:00]>
  13. >>> local.timestamp()
  14. 1718264259.95005
  15. >>> local.format()
  16. '2024-06-13 15:37:39+08:00'
  17. >>> local.format('YYYY-MM-DD HH:mm:ss ZZ')
  18. '2024-06-13 15:37:39 +08:00'
  19. >>> local.humanize()
  20. 'an hour ago'
  21. >>> local.humanize(locale='zh-cn')
  22. '1小时前'
复制代码
用户指南

Creation(创建对象)

通过now方法创建:
  1. >>> arrow.utcnow()
  2. <Arrow [2024-06-13T09:03:42.591212+00:00]>
  3. >>> arrow.now()
  4. <Arrow [2024-06-13T17:04:00.926319+08:00]>
  5. >>> arrow.now('Asia/Shanghai')
  6. <Arrow [2024-06-13T17:04:25.058905+08:00]>
复制代码
通过时间戳创建 (int or float):
  1. >>> arrow.get(1718264259)
  2. <Arrow [2024-06-13T07:37:39+00:00]>
  3. >>> arrow.get(1718264259.95005)
  4. <Arrow [2024-06-13T07:37:39.950050+00:00]>
复制代码
使用无时区时间、有时区时间,或者灵活指定时区:
  1. >>> arrow.get(datetime.utcnow())
  2. <Arrow [2024-06-13T09:14:15.099808+00:00]>
  3. >>> arrow.get(datetime(2024, 6, 13), 'Asia/Shanghai')
  4. <Arrow [2024-06-13T00:00:00+08:00]>
  5. >>> from dateutil import tz
  6. >>> arrow.get(datetime(2024, 6, 13), tz.gettz('Asia/Shanghai'))
  7. <Arrow [2024-06-13T00:00:00+08:00]>
  8. >>> arrow.get(datetime.now(),tz.gettz('Asia/Shanghai'))
  9. <Arrow [2024-06-13T17:16:02.309002+08:00]>
复制代码
从字符串转换:
  1. >>> arrow.get('2024-06-13 15:30:45', 'YYYY-MM-DD HH:mm:ss')
  2. <Arrow [2024-06-13T15:30:45+00:00]>
复制代码
从文本中查找日期:
  1. >>> arrow.get('June was born in May 1980', 'MMMM YYYY')
  2. <Arrow [1980-05-01T00:00:00+00:00]>
复制代码
自动识别ISO 8601格式的字符串,并解析出相应的日期时间对象,包括时区信息:
  1. >>> arrow.get('2024-06-13T15:34:00.000-08:00')
  2. <Arrow [2024-06-13T15:34:00-08:00]>
复制代码
直接实例化Arrow对象(使用datetime类一样的参数):
  1. >>> arrow.get(2024, 6, 13)
  2. <Arrow [2024-06-13T00:00:00+00:00]>
  3. >>>
  4. >>> arrow.Arrow(2024, 6, 13)
  5. <Arrow [2024-06-13T00:00:00+00:00]>
复制代码
Properties(属性)

获取日期时间或时间戳表示形式:
  1. >>> a = arrow.utcnow()
  2. >>> a.datetime  
  3. datetime.datetime(2024, 6, 13, 9, 25, 1, 195217, tzinfo=tzutc())
复制代码
获取一个原生的时间,包含tzinfo:
  1. >>> a.naive
  2. datetime.datetime(2024, 6, 13, 9, 25, 1, 195217)
  3. >>> a.tzinfo
  4. tzutc()
复制代码
获取任意日期时间值:
  1. >>> a.year
  2. 2024
  3. >>> a.month
  4. 6
复制代码
调用datetime类相关函数和属性:
  1. >>> a.date()
  2. datetime.date(2024, 6, 13)
  3. >>> a.time()
  4. datetime.time(9, 25, 1, 195217)
复制代码
Replace & Shift(替换和偏移)

获取一个新的Arrow对象,更改其属性,就像处理datetime类型一样:
  1. >>> arw = arrow.utcnow()
  2. >>> arw
  3. <Arrow [2024-06-13T09:33:30.538303+00:00]>
  4. >>> arw.replace(hour=4, minute=40)
  5. <Arrow [2024-06-13T04:40:30.538303+00:00]>
复制代码
或者,将属性向前或向后移动的:
  1. >>> arw.shift(weeks=+3)
  2. <Arrow [2024-07-04T09:33:30.538303+00:00]>
  3. >>> arw.shift(days=-3)  
  4. <Arrow [2024-06-10T09:33:30.538303+00:00]>
复制代码
甚至,直接替换时区
  1. >>> arw.replace(tzinfo='US/Pacific')
  2. <Arrow [2024-06-13T09:33:30.538303-07:00]>
复制代码
Format(格式化)
  1. arrow.utcnow().format('YYYY-MM-DD HH:mm:ss ZZ')
  2. '2024-06-13 09:34:54 +00:00'
复制代码
Convert(转换)

按名称或tzinfo从UTC转换为其他时区:
  1. >>> utc = arrow.utcnow()
  2. >>> utc
  3. <Arrow [2024-06-13T09:36:22.204239+00:00]>
  4. >>> utc.to('US/Pacific')
  5. <Arrow [2024-06-13T02:36:22.204239-07:00]>
  6. >>> utc.to(tz.gettz('US/Pacific'))
  7. <Arrow [2024-06-13T02:36:22.204239-07:00]>
复制代码
或者使用简写:
  1. >>> utc.to('local')
  2. <Arrow [2024-06-13T17:36:22.204239+08:00]>
  3. >>> utc.to('local').to('utc')
  4. <Arrow [2024-06-13T09:36:22.204239+00:00]>
复制代码
Humanize(人性化)

相对于现在时间的人性化表现:
  1. >>> past = arrow.utcnow().shift(hours=-1)
  2. >>> past.humanize()
  3. 'an hour ago'
复制代码
或者另一个Arrow对下或日期时间:
  1. >>> present = arrow.utcnow()
  2. >>> future = present.shift(hours=2)
  3. >>> future.humanize(present)
  4. 'in 2 hours'
复制代码
将时间表示为相对时间或仅包括时间距离:
  1. >>> present = arrow.utcnow()
  2. >>> future = present.shift(hours=2)
  3. >>> future.humanize(present)
  4. 'in 2 hours'>>> future.humanize(present, only_distance=True)'2 hours'
复制代码
指定特定的时间粒度(或多个):
  1. >>> present = arrow.utcnow()
  2. >>> future = present.shift(minutes=66)
  3. >>> future.humanize(present, granularity="minute")
  4. 'in 66 minutes'
  5. >>> future.humanize(present, granularity=["hour", "minute"])
  6. 'in an hour and 6 minutes'
  7. >>> present.humanize(future, granularity=["hour", "minute"])
  8. 'an hour and 6 minutes ago'
  9. >>> future.humanize(present, only_distance=True, granularity=["hour", "minute"])
  10. 'an hour and 6 minutes'
复制代码
支持不同时区的语言显示:
  1. >>> future = arrow.utcnow().shift(hours=1)
  2. >>> future.humanize(a, locale='ru')
  3. 'через час'
  4. >>> future.humanize(a, locale='zh-cn')
  5. '1小时后'
复制代码
Dehumanize(去人性化)

使用人类可读的字符串描述,并使用它转换到过去的时间:
  1. >>> arw = arrow.utcnow()
  2. >>> arw
  3. <Arrow [2024-06-13T09:47:35.616633+00:00]>
  4. >>> earlier = arw.dehumanize("2 days ago")
  5. >>> earlier
  6. <Arrow [2024-06-11T09:47:35.616633+00:00]>
复制代码
或者用它来转换到未来的时间:
  1. >>> arw = arrow.utcnow()
  2. >>> arw
  3. <Arrow [2024-06-13T09:47:35.616633+00:00]>
  4. >>> later = arw.dehumanize("in a month")
  5. >>> later
  6. <Arrow [2024-07-13T09:47:35.616633+00:00]>
复制代码
支持不同时区的语言转换:
  1. >>> later = arw.dehumanize('1小时后', locale="zh-cn")
  2. >>> later
  3. <Arrow [2024-06-13T10:47:35.616633+00:00]>
复制代码
Ranges & Spans(范围&跨度)

获取任意单位的时间跨度:
  1. >>> arrow.utcnow().span('hour')
  2. (<Arrow [2024-06-13T09:00:00+00:00]>, <Arrow [2024-06-13T09:59:59.999999+00:00]>)
  3. >>> arrow.utcnow().span('day')  
  4. (<Arrow [2024-06-13T00:00:00+00:00]>, <Arrow [2024-06-13T23:59:59.999999+00:00]>)
复制代码
或者只获取最大最小值:
  1. >>> arrow.utcnow().floor('hour')
  2. <Arrow [2024-06-13T09:00:00+00:00]>
  3. >>> arrow.utcnow().ceil('hour')
  4. <Arrow [2024-06-13T09:59:59.999999+00:00]>
复制代码
您还可以获取一系列时间跨度:
  1. >>> start = datetime(2024, 6, 13, 12, 30)
  2. >>> end = datetime(2024, 6, 13, 17, 15)
  3. >>> for r in arrow.Arrow.span_range('hour', start, end):
  4. ...     print(r)
  5. ...
  6. (<Arrow [2024-06-13T12:00:00+00:00]>, <Arrow [2024-06-13T12:59:59.999999+00:00]>)
  7. (<Arrow [2024-06-13T13:00:00+00:00]>, <Arrow [2024-06-13T13:59:59.999999+00:00]>)
  8. (<Arrow [2024-06-13T14:00:00+00:00]>, <Arrow [2024-06-13T14:59:59.999999+00:00]>)
  9. (<Arrow [2024-06-13T15:00:00+00:00]>, <Arrow [2024-06-13T15:59:59.999999+00:00]>)
  10. (<Arrow [2024-06-13T16:00:00+00:00]>, <Arrow [2024-06-13T16:59:59.999999+00:00]>)
  11. (<Arrow [2024-06-13T17:00:00+00:00]>, <Arrow [2024-06-13T17:59:59.999999+00:00]>)
复制代码
或者只是获取一系列时间点:
  1. >>> start = datetime(2024, 6, 13, 12, 30)
  2. >>> end = datetime(2024, 6, 13, 17, 15)
  3. >>> for r in arrow.Arrow.range('hour', start, end):
  4. ...     print(repr(r))
  5. ...
  6. <Arrow [2024-06-13T12:30:00+00:00]>
  7. <Arrow [2024-06-13T13:30:00+00:00]>
  8. <Arrow [2024-06-13T14:30:00+00:00]>
  9. <Arrow [2024-06-13T15:30:00+00:00]>
  10. <Arrow [2024-06-13T16:30:00+00:00]>
复制代码
Factories(工厂方法)

使用工厂模式实现自定义Arrow派生类型,来继承和扩展Arrow的模块API。首先,定义您的类型:
  1. class CustomArrow(arrow.Arrow):
  2. ...
  3. ...     def days_till_xmas(self):
  4. ...         xmas = arrow.Arrow(self.year, 12, 25)
  5. ...         if self > xmas:
  6. ...             xmas = xmas.shift(years=1)
  7. ...         return (xmas - self).days
复制代码
然后使用工厂:
  1. >>> factory = arrow.ArrowFactory(CustomArrow)
  2. >>> custom = factory.utcnow()
  3. >>> custom
  4. <CustomArrow [2024-06-13T10:02:04.898347+00:00]>
  5. >>> custom.days_till_xmas()
  6. 194
复制代码
Supported Tokens(支持的格式)

使用以下标记进行分析和格式化。请注意,它们与strptime的标记不同:
 标记格式示例YearYYYY2000, 2001, 2002 … 2012, 2013 YY00, 01, 02 … 12, 13MonthMMMMJanuary, February, March …1 MMMJan, Feb, Mar …1 MM01, 02, 03 … 11, 12 M1, 2, 3 … 11, 12Day of YearDDDD001, 002, 003 … 364, 365 DDD1, 2, 3 … 364, 365Day of MonthDD01, 02, 03 … 30, 31 D1, 2, 3 … 30, 31 Do1st, 2nd, 3rd … 30th, 31stDay of WeekddddMonday, Tuesday, Wednesday …2 dddMon, Tue, Wed …2 d1, 2, 3 … 6, 7ISO week dateW2011-W05-4, 2019-W17HourHH00, 01, 02 … 23, 24 H0, 1, 2 … 23, 24 hh01, 02, 03 … 11, 12 h1, 2, 3 … 11, 12AM / PMAAM, PM, am, pm1 aam, pm1Minutemm00, 01, 02 … 58, 59 m0, 1, 2 … 58, 59Secondss00, 01, 02 … 58, 59 s0, 1, 2 … 58, 59Sub-secondS…0, 02, 003, 000006, 123123123123…3TimezoneZZZAsia/Baku, Europe/Warsaw, GMT …4 ZZ-07:00, -06:00 … +06:00, +07:00, +08, Z Z-0700, -0600 … +0600, +0700, +08, ZSeconds TimestampX1381685817, 1381685817.915482 …5ms or µs Timestampx1569980330813, 1569980330813221Built-in Formats(内置格式)
  1. >>> arw = arrow.utcnow()
  2. >>> arw.format(arrow.FORMAT_ATOM)
  3. '2024-06-13 10:05:40+00:00'
  4. >>> arw.format(arrow.FORMAT_COOKIE)
  5. 'Thursday, 13-Jun-2024 10:05:40 UTC'
  6. >>> arw.format(arrow.FORMAT_RSS)
  7. 'Thu, 13 Jun 2024 10:05:40 +0000'
  8. >>> arw.format(arrow.FORMAT_RFC822)
  9. 'Thu, 13 Jun 24 10:05:40 +0000'
  10. >>> arw.format(arrow.FORMAT_RFC850)
  11. 'Thursday, 13-Jun-24 10:05:40 UTC'
  12. >>> arw.format(arrow.FORMAT_RFC1036)
  13. 'Thu, 13 Jun 24 10:05:40 +0000'
  14. >>> arw.format(arrow.FORMAT_RFC1123)
  15. 'Thu, 13 Jun 2024 10:05:40 +0000'
  16. >>> arw.format(arrow.FORMAT_RFC2822)
  17. 'Thu, 13 Jun 2024 10:05:40 +0000'
  18. >>> arw.format(arrow.FORMAT_RFC3339)  
  19. '2024-06-13 10:05:40+00:00'
  20. >>> arw.format(arrow.FORMAT_W3C)
  21. '2024-06-13 10:05:40+00:00'
复制代码
Escaping Formats(转义格式)

解析和格式化时,可以通过将格式字符串中的标记、短语和正则表达式括在方括号中来转义它们。
标记格式
  1. >>> fmt = "YYYY-MM-DD h [h] m"
  2. >>> arw = arrow.get("2024-06-13 8 h 40", fmt)
  3. >>> arw.format(fmt)                           
  4. '2024-06-13 8 h 40'
  5. >>> fmt = "YYYY-MM-DD h [hello] m"
  6. >>> arw = arrow.get("2024-06-13 8 hello 40", fmt)
  7. >>> arw
  8. <Arrow [2024-06-13T08:40:00+00:00]>
  9. >>> arw.format(fmt)
  10. '2024-06-13 8 hello 40'
  11. >>> fmt = "YYYY-MM-DD h [hello world] m"
  12. >>> arw = arrow.get("2024-05-16 8 hello world 40", fmt)
  13. >>> arw.format(fmt)
  14. '2024-05-16 8 hello world 40'
复制代码
正则

您还可以通过将正则表达式括在方括号内来转义它们。在下面的示例中,我们使用正则表达式s+来匹配分隔标记的任意数量的空白字符。如果您不提前知道令牌之间的空间数(例如,在日志文件中),这将非常有用。
  1. >>> fmt = r"ddd[\s+]MMM[\s+]DD[\s+]HH:mm:ss[\s+]YYYY"
  2. >>> arrow.get("Thu Jun 16 16:41:45 2024", fmt)
  3. <Arrow [2024-06-16T16:41:45+00:00]>
  4. >>> arrow.get("Thu \tJun 16     16:41:45        2024", fmt)
  5. <Arrow [2024-06-16T16:41:45+00:00]>
  6. >>> arrow.get("Thu Jun 16    16:41:45  2024", fmt)
  7. <Arrow [2024-06-16T16:41:45+00:00]>
复制代码
Punctuation(标点符号)

日期和时间格式的两侧可以用以下列表中的一个标点符号隔开:、.;:!" \ ' [ ] { } ( ) < >`
  1. >>> arrow.get("Cool date: 2024-06-16T09:12:45.123456+04:30.", "YYYY-MM-DDTHH:mm:ss.SZZ")
  2. <Arrow [2024-06-16T09:12:45.123456+04:30]>
  3. >>> arrow.get("Tomorrow (2024-06-16) is Halloween!", "YYYY-MM-DD")
  4. <Arrow [2024-06-16T00:00:00+00:00]>
  5. >>> arrow.get("Halloween is on 2024.06.16.", "YYYY.MM.DD")
  6. <Arrow [2024-06-16T00:00:00+00:00]>
  7. >>> arrow.get("It's Halloween tomorrow (2024-06-16)!", "YYYY-MM-DD")
  8. Traceback (most recent call last):
  9.   File "<stdin>", line 1, in <module>
  10.   File "C:\Users\LocalCache\local-packages\Python312\site-packages\arrow\api.py", line 91, in get
  11.     return _factory.get(*args, **kwargs)
  12.            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  13.   File "C:\Users\LocalCache\local-packages\Python312\site-packages\arrow\factory.py", line 292, in get
  14.     dt = parser.DateTimeParser(locale).parse(
  15.          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  16.   File "C:\Users\LocalCache\local-packages\Python312\site-packages\arrow\parser.py", line 323, in parse
  17.     raise ParserMatchError(
  18. arrow.parser.ParserMatchError: Failed to match 'YYYY-MM-DD' when parsing "It's Halloween tomorrow (2024-06-16)!".
复制代码
Redundant Whitespace(冗余空白字符处理)

多余的空白字符(空格、制表符和换行符)可以通过将normalize_whitespace标志传递到arrow.get来自动规范化:
  1. >>> arrow.get('\t \n  2024-06-13T12:30:45.123456 \t \n', normalize_whitespace=True)
  2. <Arrow [2024-06-13T12:30:45.123456+00:00]>
  3. >>> arrow.get('2024-06-13  T \n   12:30:45\t123456', 'YYYY-MM-DD T HH:mm:ss S', normalize_whitespace=True)
  4. <Arrow [2024-06-13T12:30:45.123456+00:00]>
复制代码
 
作者:〖十月狐狸〗
出处:http://www.cnblogs.com/sesshoumaru/
欢迎任何形式的转载,但请务必注明出处。
本人水平有限,如果文章和代码有表述不当之处,还请不吝赐教。

来源:https://www.cnblogs.com/sesshoumaru/p/18261860
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具