Fork me on GitHub

时间序列之time模块

时间序列之time模块

在我们的生活中,时间总是无处不在的:

  • 我每天早上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模块(后面介绍)。

使用

使用之前我们先导入模块,否则报错

1
import time

1、time:查看当前时间的时间戳

1
2
3
time.time()

1633396517.702991

2、localtime:查看当前时间的时间(以元组的形式)

如果我们不加参数,默认是当前时间的时间戳作为参数

传入的参数是时间戳。默认是当前时间的时间戳

1
2
3
4
5
6
7
8
9
10
11
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是决定是否为夏令时的旗帜

此外,我们还可以指定某个具体的时间戳作为参数:

1
2
3
4
5
6
7
8
9
10
11
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时区) ,可传入时间戳格式时间

传入的参数必须是时间戳。默认是当前时间的时间戳

1
2
3
4
5
6
7
8
9
10
11
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/

本文标题:时间序列之time模块

发布时间:2021年10月05日 - 22:10

原始链接:http://www.renpeter.cn/2021/10/05/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E4%B9%8Btime%E6%A8%A1%E5%9D%97.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea