说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python自带的时间处理模块需要理解一些时间相关的概念,对于一般使用人员有些门槛,效率也不高,因此推荐一个三方时间处理库 Arrow。它受 moment.js 和 requests 的启发而诞生。
Arrow 提供了一个友好而且非常易懂的方法,用于创建时间、计算时间、格式化时间,还可以对时间做转化、提取、兼容 python datetime 类型。
安装方法:
pip install arrow -U
导入方法:
import arrow
以下是一些最常用的方法:
import arrow
# 解析字符为时间
arrow.get('2020-08-01T21:23:58.970460+07:00')
# <Arrow [2020-08-01T21:23:58.970460+07:00]>
utc = arrow.utcnow() # 取当前 utc 时间
utc
# <Arrow [2020-08-01T21:23:58.970460+00:00]>
utc = utc.shift(hours=-1) # 向前一小时
utc
# <Arrow [2020-08-01T20:23:58.970460+00:00]>
# 转换为北京时间
local = utc.to('Asia/Shanghai')
local
# <Arrow [2020-08-01T13:23:58.970460-08:00]>
local.timestamp # 时间戳
# 1368303838
local.format() # 格式化时间
# '2020-08-01 13:23:58 -07:00'
# 指定格式
local.format('YYYY-MM-DD HH:mm:ss ZZ')
# '2020-07-30 19:21:30 +08:00'
local.humanize() # 时间人性化,说人话
# 'an hour ago'
local.humanize(locale='zh_cn') # 说中国话
# '11秒前'
看完你应该入门了。
arrow 创建时间,会生成一个 Arrow 对象
以下创建一个当前时间:
import arrow
# 当前的本地时间
arrow.now()
# <Arrow [2020-07-30T14:20:46.539623+08:00]>
# 现在的 utc 时间
arrow.utcnow()
# <Arrow [2020-07-30T03:44:46.706647+00:00]>
# 当前的美国太平洋时间
arrow.now('US/Pacific')
# <Arrow [2020-07-29T23:21:33.349793-07:00]>
# 当前北京时间
arrow.now('Asia/Shanghai')
# <Arrow [2020-07-30T14:22:16.082242+08:00]>
arrow.get('20200801 19:23:23')
# <Arrow [2020-08-01T19:23:23+00:00]>
根据整型或者浮点型时间戳创建时间:
arrow.get(1599878923)
# <Arrow [2020-09-12T02:48:43+00:00]>
arrow.get(1599878923.183723)
# <Arrow [2020-09-12T02:48:43.183723+00:00]>
支持ISO 8601规定的格式:
# 带毫秒及时区,北京时间
arrow.get('2020-08-01T12:23:58.970460+08:00')
# <Arrow [2020-08-01T12:23:58.970460+08:00]>
arrow.get('20200801 19:23:23')
# <Arrow [2020-08-01T19:23:23+00:00]>
arrow.get('20200801')
# <Arrow [2020-08-01T00:00:00+00:00]>
# 解析文本,指定格式
arrow.get('June was born in May 2010', 'MMMM YYYY')
# <Arrow [2010-05-01T00:00:00+00:00]>
arrow.get('2020-08-01 12:30:45', 'YYYY-MM-DD HH:mm:ss')
# <Arrow [2020-08-01T12:30:45+00:00]>
arrow.get(2020, 8, 1, 17)
# <Arrow [2020-08-01T17:00:00+00:00]>
arrow.Arrow(2020, 8, 1, 17)
# <Arrow [2020-08-01T17:00:00+00:00]>
Arrow 对象支持很多实用的属性:
t = arrow.now() # 创建一个本地当前时间
t
# <Arrow [2020-07-31T11:08:25.334956+08:00]>
t.datetime # datetime 格式
t.naive # 本地 datetime
# datetime.datetime(2020, 7, 31, 11, 8, 25, 334956, tzinfo=tzlocal())
t.timestamp # 时间戳
# 1596164905
t.tzinfo # 时区
# tzlocal()
t.year # 2020 年数字
t.quarter # 3 季度
t.month # 7 月
t.week # 31 周数
t.day # 31 日数
t.hour # 11 小时数
t.minute # 8 分钟数
t.second # 25 秒数
t.microsecond # 334956 微秒
t.weekday() # 4 周五,从0开始
t.date() # datetime 类型,年月日
# datetime.date(2020, 7, 31)
t.time() # datetime 类型的时分秒微秒
# datetime.time(11, 8, 25, 334956)
t.ctime() # ctime 格式
# 'Fri Jul 31 11:08:25 2020'
t.max # 最大时间
# <Arrow [9999-12-31T23:59:59.999999+00:00]>
t.min # 最小时间
# <Arrow [0001-01-01T00:00:00+00:00]>
格式化(Format)是指把时间转为人类易读的字符串形式。
a = arrow.now()
a.format()
a.format('YYYY-MM-DD HH:mm:ss ZZ')
# '2020-05-27 10:30:35 +08:00'
arrow 内置了一些格式:
a.= arrow.utcnow()
a.format(arrow.FORMAT_ATOM)
# '2020-05-27 10:30:35+00:00'
a.format(arrow.FORMAT_COOKIE)
# 'Wednesday, 27-May-2020 10:30:35 UTC'
a.format(arrow.FORMAT_RSS)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC822)
# 'Wed, 27 May 20 10:30:35 +0000'
a.format(arrow.FORMAT_RFC850)
# 'Wednesday, 27-May-20 10:30:35 UTC'
a.format(arrow.FORMAT_RFC1036)
# 'Wed, 27 May 20 10:30:35 +0000'
a.format(arrow.FORMAT_RFC1123)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC2822)
# 'Wed, 27 May 2020 10:30:35 +0000'
a.format(arrow.FORMAT_RFC3339)
# '2020-05-27 10:30:35+00:00'
a.format(arrow.FORMAT_W3C)
# '2020-05-27 10:30:35+00:00'
可以对时间中的日期、小时等进行替换,以达到修改时间的目的,比如我们只要日期,可以将时分秒替换为 0。修改时区,也可以通过替换时间来实现。
a = arrow.utcnow()
a
# <Arrow [2020-07-31T03:38:36.198675+00:00]>
a.replace(year=2021, month=8) # 修改年份和月份
# <Arrow [2021-08-31T03:38:36.198675+00:00]>
a.replace(tzinfo='US/Pacific') # 修改时区
# <Arrow [2020-07-31T03:38:36.198675-07:00]>
a.replace(tzinfo='Asia/Shanghai') # 修改为北京时间
# <Arrow [2020-07-31T03:38:36.198675+08:00]>
需要注意的是,替换修改时间时,要保证最终的时间是一个合法的时间,如上例中的月份不能修改为 2 月。
移动(Shift)是指可以将指定时间向前或者向后移动一定周期,如明天的此时,去年的今日。
a.shift(weeks=+3) # 向未来三周
# <Arrow [2020-08-21T03:38:36.198675+00:00]>
a.shift(hours=-2) # 过去两小时
# <Arrow [2020-07-31T01:38:36.198675+00:00]>
a.shift(years=1, months=-1) # 向未来一年,再向前一月
# <Arrow [2021-06-30T03:38:36.198675+00:00]>
a.shift(weekday=5) # 移到未来最近的周六
# <Arrow [2020-08-01T09:43:26.569633+00:00]>
a.shift(weekday=0) # 周日
除了上文 replace 方法转换外,还有专门的时区转换方法。以下从 utc 转到北京时间:
utc = arrow.utcnow()
utc
# <Arrow [2020-07-31T04:55:52.176325+00:00]>
utc.to('Asia/Shanghai')
utc.to(tz.gettz('Asia/Shanghai'))
# <Arrow [2020-07-31T04:55:52.176325+08:00]>
utc.to('local')
# <Arrow [2020-07-31T04:55:52.176325+08:00]>
utc.to('local').to('utc')
# <Arrow [2020-07-31T04:55:52.176325+00:00]>
公认的时区表达式:
人性化(Humanize)时间,是指将时间转化为人类易于主观识别的时间表达。以下是和当前时间对比:
a = arrow.utcnow()
a.humanize()
# 'just now'
a.shift(hours=-1).humanize()
# 'an hour ago'
也可以与另外一个指定的时间作对比:
a.humanize(a.shift(days=1))
# 'a day ago'
a.humanize(a.shift(hours=1))
# 'an hour ago'
# 只留下长度
a.humanize(a.shift(hours=1), only_distance=True)
# 'an hour'
可以指定单位:
# 单位为分钟
a.humanize(a.shift(minutes=66), granularity="minute")
# '66 minutes ago'
# 单位为时分
a.humanize(a.shift(minutes=66), granularity=["hour", "minute"])
# 'an hour and 6 minutes ago'
# 只留时长
a.humanize(a.shift(minutes=66),
granularity=["hour", "minute"],
only_distance=True,)
# 'an hour and 6 minutes'
可以使用中文等其他语言:
# 指定为中文
utc.humanize(locale='zh_cn')
# '17分钟前'
a.humanize(a.shift(days=1), locale='zh_cn')
# '1天前'
可以定义一个时间区间:
arrow.utcnow().span('hour') # 一个小时
# (<Arrow [2020-05-07T05:00:00+00:00]>, <Arrow [2020-05-07T05:59:59.999999+00:00]>)
arrow.utcnow().floor('hour') # 最小
# <Arrow [2020-05-07T05:00:00+00:00]>
arrow.utcnow().ceil('hour') # 最大
# <Arrow [2020-05-07T05:59:59.999999+00:00]>
start = datetime(2020, 5, 5, 12, 30)
end = datetime(2020, 5, 5, 17, 15)
for r in arrow.Arrow.span_range('hour', start, end):
print(r)
'''
(<Arrow [2020-05-05T12:00:00+00:00]>, <Arrow [2020-05-05T12:59:59.999999+00:00]>)
(<Arrow [2020-05-05T13:00:00+00:00]>, <Arrow [2020-05-05T13:59:59.999999+00:00]>)
(<Arrow [2020-05-05T14:00:00+00:00]>, <Arrow [2020-05-05T14:59:59.999999+00:00]>)
(<Arrow [2020-05-05T15:00:00+00:00]>, <Arrow [2020-05-05T15:59:59.999999+00:00]>)
(<Arrow [2020-05-05T16:00:00+00:00]>, <Arrow [2020-05-05T16:59:59.999999+00:00]>)
'''
start = datetime(2020, 5, 5, 12, 30)
end = datetime(2020, 5, 5, 17, 15)
for r in arrow.Arrow.range('hour', start, end):
print(repr(r))
'''
<Arrow [2020-05-05T12:30:00+00:00]>
<Arrow [2020-05-05T13:30:00+00:00]>
<Arrow [2020-05-05T14:30:00+00:00]>
<Arrow [2020-05-05T15:30:00+00:00]>
<Arrow [2020-05-05T16:30:00+00:00]>
'''
本站站长也给此项目贡献过代码。
更新时间:2020-08-04 14:23:15 标签:python 时间