python的time库详解
Posted 尤尔小屋的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的time库详解相关的知识,希望对你有一定的参考价值。
公众号:尤而小屋
作者:Peter
编辑:Peter
大家好,我是Peter~
在我们的生活中,时间总是无处不在的:
- 我每天早上9点坐地铁去上班
- 上周一的上午10点半,我开了个会
- 2008年8月8日北京奥运会开幕
- 小明同学出生在1998年1月4日10点09分
- 北京时间是以东八区为准的
- 我想给这个自己的爬虫价格定时任务……
我们似乎生活在一个被年、月、日、时、分、秒、毫秒等时间包围的世界中,但你真的了解时间吗?Python又有哪些处理时间的相关库呢?时间序列又有什么妙用?
接下来Peter会开启Pandas一系列以时间序列为主题的进阶文章,随时更新,欢迎阅读~
科普内容
秒
目前世界上公认的秒:指的是在现行国际单位制下,在1967年召开的第13届国际度量衡大会对秒的定义是:铯133原子基态的两个超精细能级间跃迁对应辐射的9,192,631,770个周期的持续时间。
起始历元定在1958年1月1日0时。
下面是记录的是秒的各级单位(来自维基百科),感觉自己也长见识了:
闰秒
除了我们常听到的闰年,还有闰秒的概念。
闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒);闰秒一般加在公历年末或公历六月末。
GMT
格林尼治平均时间(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。
自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。
格林尼治标准时间的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。
UTC
协调世界时间(Coordinated Universal Time)简称为UTC,也称为世界标准时间,基于国际原子钟,误差为每日数纳秒。协调世界时的秒长与原子时的秒长一致,在时刻上则要求尽量与世界时接近(规定二者的差值保持在 0.9秒以内)。
Unix时间戳
时间戳指的是从协调世界时间(UTC)1970年1月1日0时0分0秒开始到现在的总秒数,一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
时区
时区是地球上的区域使用同一个时间定义。
有关国际会议决定将地球表面按经线从南到北,划分成24个时区,并且规定相邻区域的时间相差1小时。当人们跨过一个区域,就将自己的时钟校正1小时(规定:向西减1小时,向东加1小时),跨过几个区域就加或减几小时。比如我们伟大的中国处于东八区,表示为GMT+8。
Python时间模块
Python中有很多的时间模块能够处理我们遇到的各种时间问题,后续会分别介绍各种库的使用,它们分别是:
- time
- datetime
- calendar
- pytz
- dateutil
- arrow
time 模块
简介
首先介绍的是Python中常用 time 模块。在Python文档中,time是属于GOSS(Generic Operating System Services),提供的是更加接近操作系统层面的服务;同时,time模块主要还是围绕unix timestamp时间戳来进行的。
⚠️注意点:由于该模块是基于Unix Timestamp,所以其能表述的日期范围只能在 1970-2038 之间;如果说我们涉及到的日期不在这个范围内,必须使用datetime模块(后面介绍)。
使用
使用之前我们先导入模块,否则报错
import time
1、time:查看当前时间的时间戳
time.time()
1633396517.702991
2、localtime:查看当前时间的时间(以元组的形式)
如果我们不加参数,默认是当前时间的时间戳作为参数
传入的参数是时间戳。默认是当前时间的时间戳
time.localtime()
time.struct_time(tm_year=2021, # 元组形式:年月日时分秒
tm_mon=10,
tm_mday=5,
tm_hour=9,
tm_min=15,
tm_sec=17,
tm_wday=1,
tm_yday=278,
tm_isdst=0)
下表格是每个参数的含义解释:
序号 | 属性 | 值 |
---|---|---|
0 | tm_year | 年,比如2020 |
1 | tm_mon | 月,1 到 12 |
2 | tm_mday | 日,1 到 31 |
3 | tm_hour | 时,0 到 23 |
4 | tm_min | 分,0 到 59 |
5 | tm_sec | 秒,0 到 61 (60或61 是闰秒) |
6 | tm_wday | 一周中的第几天,0到6 (0是周一) |
7 | tm_yday | 一年中的第几天,1 到 366 |
8 | tm_isdst | -1, 0, 1, -1是决定是否为夏令时的旗帜 |
此外,我们还可以指定某个具体的时间戳作为参数:
time.localtime(1600000000) # 指定时间戳
time.struct_time(tm_year=2020,
tm_mon=9,
tm_mday=13,
tm_hour=20,
tm_min=26,
tm_sec=40,
tm_wday=6,
tm_yday=257,
tm_isdst=0)
3、gmtime:返回当前时间的struct_time形式,UTC时区(0时区) ,可传入时间戳格式时间
传入的参数必须是时间戳。默认是当前时间的时间戳
time.gmtime() # 默认当前时间戳
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=5, tm_hour=1, tm_min=33, tm_sec=25, tm_wday=1, tm_yday=278, tm_isdst=0)
time.gmtime(time.time()) # time.time()也是获取当前时间戳
time.struct_time(tm_year=2021, tm_mon=10, tm_mday=5, tm_hour=1, tm_min=33, tm_sec=25, tm_wday=1, tm_yday=278, tm_isdst=0)
time.gmtime(1617880000) # 指定一个时间戳
time.struct_time(tm_year=2021, tm_mon=4, tm_mday=8, tm_hour=11, tm_min=6, tm_sec=40, tm_wday=3, tm_yday=98, tm_isdst=0)
4、asctime:返回字符串形式的时间,可以传入struct_time形式时间,用来做转化
传入的参数是时间元组形式;结果是字符串形式
(1)默认情况使用:
(2)通过time.localtime()得到一个时间元组形式:
(3)传入当地时间的时间戳形式:
(4)通过time.time()得到时间戳,再将结果传给time.localtime(),得到时间元组,最后将元组再传给time.asctime():
5、ctime:返回字符串形式的时间,可以传入时间戳格式时间,用来做转化
传入的参数是时间戳,结果是字符串形式
(1)默认情况
(2)指定某个时间戳
(3)传入中间结果的时间戳
time.time()得到的是当前时间的时间戳
6、mktime:时间元组转成时间戳形式,必须带上时间元组作为参数
传入参数是时间元组形式,返回的结果是时间戳
(1)通过time.localtime()得到时间元组,传给time.mktime
(2)传入其他事件元组的结果作为参数
7、strftime:把一个时间元组格式化为时间字符串。如果未指定,默认将传入time.localtime()。如果元组中任何一个元素越界,将会报错。
传入参数是元组格式的时间,返回结果是时间字符串
(1)默认输出的都是当前时间
(2)指定某个时间元组
在指定格式的同时,我们还可以传入一个时间元组:
下表格是常用的时间格式和含义:
格式 | 含义 | 取值范围(样式) |
---|---|---|
%y | 去掉世纪的年份 | 00-99,如“19” |
%Y | 完整的年份 | 如2019 |
%j | 指定日期是一年中的第几天 | 范围001-366 |
%m | 返回的是月份 | 范围:01-12 |
%b | 本地简化月份的名称 | 简写的英文月份 |
%B | 本地完整月份的名称 | 完整的英文月份 |
%d | 该月的第几日 | 如,5月1日返回的是“01” |
%H | 第几小时,24小时制 | 00-23 |
%l | 第几小时,12小时制 | 00-12 |
%M | 分钟 | 00-59 |
%S | 秒 | 00-59 |
%U | 该年中的第几个星期(周日为一周的起点) | 00-53 |
%W | 同上,周一为起点 | 00-53 |
%w | 一个星期中的第几天 | 0-6 |
%Z | 时区 | 在大陆测试返回的是CST |
%x | 日期 | 日/月/年 |
%X | 时间 | 时:分:秒 |
%c | 详细日期时间 | 日/月/年时:分:秒 |
%% | %字符 | '%'字符 |
%p | 上下午 | AM or PM |
8、strptime:将字符串形式的时间转成时间元组;和strftime相反功能
两个参数:第一个是字符串形式的时间数据,第二个是我们指定的格式
8大方法总结
time模块的8大方法的输入和输出总结:
方法 | 输入 | 输出 |
---|---|---|
time | 无 | 时间戳 |
localtime | 时间戳 | 时间元组 |
gmtime | 时间戳 | 时间元组 |
asctime | 时间元组 | 字符串 |
ctime | 时间戳 | 字符串 |
mktime | 时间元组 | 时间戳 |
strftime | 格式、时间元组(可选) | 字符串 |
strptime | 字符串、格式 | 时间元组 |
时间网站
时间与日期
1、公历转农历:https://pypi.python.org/pypi/LunarSolarConverter/
2、Moment:https://github.com/zachwill/moment
3、When:https://whenpy.readthedocs.io/en/latest/
4、Pendulum:https://pendulum.eustace.io/
5、时间机器:https://github.com/spulec/freezegun
6、工作日历:https://github.com/peopledoc/workalendar
7、中国法定节假日:https://github.com/NateScarlet/holiday-cn
8、Python3-cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
时间戳相关
在很多的时候我们遇到的时间都是通过时间戳的形式表示的,如何将时间戳转成我们常见的时间形式呢?介绍几个常用的网站:
1、站长工具:https://tool.chinaz.com/tools/unixtime.aspx
2、sojson:https://www.sojson.com/unixtime.html
3、Toolfun:https://tools.fun/timestamp.html
4、北京时间:https://www.beijing-time.org/shijianchuo/
5、在线工具:https://tool.lu/timestamp/
最后一张6个模块的完整思维导图送给你们,后续会更新剩下5个库的使用:
- 欢迎关注公众号:尤而小屋
- 回复time即可领取高清思维导图
以上是关于python的time库详解的主要内容,如果未能解决你的问题,请参考以下文章