python标准库学习(2)
标准库time、datetime和calendar
2019-09-10
python标准库中处理时间、日期的主要是time、datetime和calendar这3个库,尽管一些第三方库如dateutil、Arrow、pendulum、moment、maya、Delorean、When.py等在时间和日期处理方面扩展了很多功能,使得处理更加简洁或人性化,但标准库处理时间和日期仍然是最常见和常用的。
1. time:时间获取与转换
time库提供了近30个方法和10多个常量,是python处理时间相关的数据类型的基础。time提供的方法主要有3类:时间获取、时间转换和时间相关的操作。
1.1 时间的表示方式
时间的表示方式主要有3种:
- 时间戳(timestamp):表示从1970年1月1日0时0分0秒开始,按秒计算的时间偏移量;这里的1970年1月1日0时0分0秒被称为epoch,是时间开始的点,取决于系统平台。
- 时间元组(struct_time):也称“结构体时间”,用一个元组表示的时间信息;
- 时间字符串:用字符串来格式化显示时间。
以上3中表示形式在time中都有体现:
import time
time.time() # 时间戳:1568629886.590658
time.localtime() # 结构体时间:time.struct_time(tm_year=2019, /
# tm_mon=9, tm_mday=16, tm_hour=18, tm_min=31, /
# tm_sec=56, tm_wday=0, tm_yday=259, tm_isdst=0)
# 注意这个时间结构体是一个元组,不能通过类似time.localtime()['tm_min']来取值
time.ctime() # 'Mon Sep 16 18:31:40 2019'
以下是获取时间的常用方法:
| 方法 | 作用 | 备注 |
|---|---|---|
| time.time() | 时间戳,返回浮点数的秒数,以epoch为起点,截止当前时间,时区为标准时间 | 无参数 |
| time.time_ns() | 时间戳,返回浮点数的纳秒数,以epoch为起点,截止当前时间,时区为标准时间 | 无参数 |
| time.gmtime([secs]) | 将时间戳转换为为单位的时间转换为标准时间下的结构体元组 | 参数为以秒为单位的数,默认为time.time() |
| time.localtime([secs]) | 将时间戳转换为为单位的时间转换为系统所在时区下的结构体元组 | 参数为以秒为单位的数,默认为time.time() |
| time.ctime([secs]) | 返回的时间转换为表示本地时间的字符串,以epoch为起点,截止当前时间 | 参数为以秒为单位的数,默认为time.time() |
在结构体时间中,一般会返回一个包含8个元素的struct_time对象,这个元组可以通过位置索引(index)访问:
| 索引 | 属性 | 值 | 含义 |
|---|---|---|---|
| 0 | tm_year | (例如,1993) | 年份 |
| 1 | tm_mon | range [1, 12] | 月份 |
| 2 | tm_mday | range [1, 31] | 当月第几天 |
| 3 | tm_hour | range [0, 23] | 当日第几小时 |
| 4 | tm_min | range [0, 59] | 分 |
| 5 | tm_sec | range [0, 61] | 秒 |
| 6 | tm_wday | range [0, 6] ,周一为 0 | 周几 |
| 7 | tm_yday | range [1, 366] | 当年的第几天 |
| 8 | tm_isdst | 0, 1 或 -1 | 是否是夏令时 |
1.2 不同时间表示之间的转换

先来看时间戳的两种转化形式:
import time
sect = 1229711247
time.ctime(sect) # 'Sat Dec 20 02:27:27 2008'
time.gmtime(sect) # time.struct_time(tm_year=2008, tm_mon=12, /
# tm_mday=19, tm_hour=18, tm_min=27, tm_sec=27, /
# tm_wday=4, tm_yday=354, tm_isdst=0)
strptime和strftime实现了字符串和时间元组之间的相互转换,由于涉及将时间元组转化为一定格式的时间字符串,因此需要指定format格式,一般用%加一个字母来表示一个时间字段(文档中称为directive,“指令”):
| 指令 | 含义 |
|---|---|
| %a | 本地化的缩写星期中每日的名称 |
| %A | 本地化的星期中每日的完整名称 |
| %b | 本地化的月缩写名称 |
| %B | 本地化的月完整名称 |
| %c | 本地化的适当日期和时间表示 |
| %d | 十进制数 [01,31] 表示的月中日。 |
| %H | 十进制数 [00,23] 表示的小时(24小时制)。 |
| %I | 十进制数 [01,12] 表示的小时(12小时制)。 |
| %j | 十进制数 [001,366] 表示的年中日。 |
| %m | 十进制数 [01,12] 表示的月。 |
| %M | 十进制数 [00,59] 表示的分钟。 |
| %p | 本地化的 AM 或 PM 。 |
| %S | 十进制数 [00,61] 表示的秒。 |
| %U | 十进制数 [00,53] 表示的一年中的周数(星期日作为一周的第一天) |
| %w | 十进制数 [0(星期日),6] 表示的周中日。 |
| %W | 十进制数 [00,53] 表示的一年中的周数(星期一作为一周的第一天)。 |
| %x | 本地化的适当日期表示。 |
| %X | 本地化的适当时间表示。 |
| %y | 十进制数 [00,99] 表示的没有世纪的年份。 |
| %Y | 十进制数表示的带世纪的年份。 |
| %z | 时区偏移以格式 |
| %Z | 时区名称(如果不存在时区,则不包含字符)。 |
| %% | 字面的 ‘%’ 字符。 |
以下示例说明,字符串和时间元组之间的转换可以非常灵活:
import time
# 将字符串转化为时间元组
dt = '2018-12-31'
ts = time.strptime(dt, '%Y-%m-%d')
print(ts) # time.struct_time(tm_year=2018, /
# tm_mon=12, tm_mday=31, tm_hour=0, tm_min=0, tm_sec=0, /
# tm_wday=0, tm_yday=365, tm_isdst=-1)
# 将时间元组转化为字符串
tm = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
print(tm) # '2019-09-17 19:41:02'
1.3 time模块中的其他函数
除时间获取和转换外,time另外还有2个方面的功能:使程序暂停指定时间和计算程序运行时间。
暂停指定时间用time.sleep(secs)方法,根据文档,“暂停执行调用线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意量。”
计算程序运行时间方面,python标准库中提供了timeit,这个库可以用命令行方式和调用方法的方式计算程序运行时间。time中主要可以通过3个方法来测量程序运行时间:
| 函数 | 说明 |
|---|---|
| time.time() | 返回epoch为起点的系统时间的秒数,依赖于系统平台 |
| time.perf_counter() | 返回一个CPU级别的精确的秒数。包括睡眠期间经过的时间,并且是系统范围的。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效 |
| time.process_time() | 返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)。它不包括睡眠期间经过的时间。根据定义,它在整个进程范围中。返回值的参考点未定义,因此只有连续调用结果之间的差异才有效 |
以上3个方法返回的单位都是秒,对应地有3个带_ns返回以纳秒为单位的数字:time_ns()、perf_counter_ns()、process_time_ns()。以下用一个例子来说明计时功能的实现,以及这些方法的不同:
def fibonacci(n):
a, b = 0, 1
while n > 0:
a, b = b, a + b
n -= 1
yield a
a_point_tm = time.time()
a_point_perf = time.perf_counter()
a_point_proc = time

本文详细介绍了Python标准库中的time、datetime和calendar模块,涵盖了时间获取与转换、日期时间类型以及日历相关函数。time模块包括时间戳、时间元组和时间字符串的表示及转换,datetime模块提供了日期、时间、时间差的处理,calendar模块则包含日历相关的实用函数。通过示例展示了如何使用这些模块进行日期时间操作。
最低0.47元/天 解锁文章
1853

被折叠的 条评论
为什么被折叠?



