python标准库学习(2):time、datetime和calendar

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

标准库time、datetime和calendar

2019-09-10

python标准库中处理时间、日期的主要是time、datetime和calendar这3个库,尽管一些第三方库如dateutilArrowpendulummomentmayaDeloreanWhen.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)

strptimestrftime实现了字符串和时间元组之间的相互转换,由于涉及将时间元组转化为一定格式的时间字符串,因此需要指定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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值