python时间模块方法_Python时间模块,超实用总结!

本文详细总结了Python的datetime模块,包括date、time、datetime对象的创建和使用,时间运算以及tzinfo时区处理。通过实例演示了时间的格式化输出和时间差计算,帮助开发者更好地理解和应用时间模块。
摘要由CSDN通过智能技术生成

原标题:Python时间模块,超实用总结!

来自公众号: Python与算法社区

今天是Python时间模块核心使用逻辑。本篇思维导图如下:

327f30859882c9f9e5f394e5c0fb3c7c.png

Python内置一个时间模块 datetime ,提供我们关于时间的表达。记录时间无所不在,日志文件,程序运行起始时间和时长,销量预测的特征等等,我们都能看到时间的身影。

这篇专题总结 datetime 模块最主要用法,希望通过此文,大家使用那些时间处理的常用API时,能信手拈来,不用 help 函数,不用搜索。

1 核心逻辑

datetime 模块提供日期和时间各自分类的对象,日期处理相关的对象 date ,时间处理相关的 time ,日期和时间的完整结合对象 datetime .

日期和时间的加减操作得到 timedelta 对象.

此时此刻 2020-8-28 21:45,这个时间是本地时间,很明显纽约时间肯定不是此值,柏林时间也肯定不是这个值。Python为支持不同地区的时间表达,特意抽象出 tzinfo 对象,并有一个默认实现对象.

以上就是datetime模块的几个核心对象以及对应的现实意义。

2 date、time和datetime对象

下面介绍最基本3个对象的最基本用法。首先,从 datetime 模块导入3个对象

In [ 1]: fromdatetime importdate,time,datetime

构造一个日期date实例,2020年9月1日:

In [ 2]: date( 2020, 9, 1)

Out[ 2]: datetime.date( 2020, 9, 1)

构造一个时间time实例,10点10分0秒:

In [ 3]: time( 10, 10, 0)

Out[ 3]: datetime.time( 10, 10)

构造一个日期+时间的完整datetime实例,2020年9月1日 10点10分0秒:

In [ 4]: datetime( 2020, 9, 1, 10, 10, 10)

Out[ 4]: datetime.datetime( 2020, 9, 1, 10, 10, 10)

自己构造时间没什么意义,更有意义的是打印当前时间,比如此时程序启动打印下时间,如果程序可能运行十几天,很明显使用日期+时间的完整datetime实例。

此方法归属于datetime类上的方法,所以无须构造datetime实例,直接如下:

datetime.today # datetime类的today方法

Out[ 5]: datetime.datetime( 2020, 8, 28, 22, 0, 47, 439509)

打印结果显示年月日时分秒毫秒还可以使用类方法 now :

In [ 6]: datetime.now

Out[ 6]: datetime.datetime( 2020, 8, 28, 22, 1, 28, 737166)

直接打印当前时间,返回日期+时间的字符串结果:

In [ 7]: print(datetime.now)

2020-08-2822: 02: 57.217572

如果我们不想显示毫秒,这就涉及到日期+时间的打印格式化问题。使用datetime类方法 strftime (string format time),用法如下:

In [ 8]: datetime.strftime(datetime.now, '%Y-%m-%d %H:%M:%S')

Out[ 8]: '2020-08-28 22:06:20'

这就涉及到打印格式化字符,常用的几个:

字符

意义

%Y

完整的年份

%y

去掉世纪的年份

%m

月份(01 - 12)

%d

一个月中的第几天(01 - 31)

%H

一天中的第几个小时(24小时制,00 - 23)

%M

分钟数(00 - 59)

%S

秒(01 - 61)

%w

一个星期中的第几天(0 - 6,0是星期天)

%Z

时区的名字(如果不存在为空字符)

如果读入一个时间列,此时type为str,为了对此作时间运算,需要将其转化为datetime,使用 strptime (string parse time),它是datetime的类方法:

In [ 11]: datetime.strptime( '2020-08-28 22:06:20', '%Y-%m-%d %H:%M:%S')

Out[ 11]: datetime.datetime( 2020, 8, 28, 22, 6, 20)

字符型日期+时间要想正确转化为datetime对象,字符串和格式必须要匹配,否则会抛错:

In [ 13]: datetime.strptime( '2020-08-28 22:06:20',

'%Y/%m/%d %H:%M:%S')

ValueError: time data '2020-08-28 22:06:20'

does notmatch format '%Y/%m/%d %H:%M:%S'

3 基本运算

有时需要求偏离某个时间的时间, timedelta 对象能满足此需求。

比如,求当前时间的前12小时的日期+时间。

首先,导入 timedelta 类:

In [ 15]: fromdatetime importtimedelta

直接使用当前时间减去 timedelta 表示的12小时长度,注意第一个参数的含义为days,所以除以 24:

In [ 16]: datetime.now - timedelta( 12/ 24)

Out[ 16]: datetime.datetime( 2020, 8, 28, 10, 22, 44, 287246)

由上面这个用法,可以总结为:

datetime1 - timedelta1 = datetime2

所以 datetime1 - datetime2 = timedelta1,故两个时间相减得到timedelta类型的实例。

除此之外,还有一个小方法,可能会用到,就是datetime类上的 combine 方法,它能组合date实例和time实例为datetime实例,如下所示:

In [ 17]: datetime.combine(date( 2020, 9, 1),time( 10, 10, 0))

Out[ 17]: datetime.datetime( 2020, 9, 1, 10, 10)

4 关于tzinfo

为了更好统一全球时间,世界规定了一个UTC时间,即全球统一时间,比如假设与之相比北京时间比它早8小时,曼谷比它早7小时等。

比如打印当前时间时,

```python

In [ 6]: print(datetime.now)

2020-08-2822: 33: 35.393709

以上显示的这个时间,其实并不完整,我当然明白它是我所在地的时间,但是其他国家的开发者看到这个时间时,或许以为是UTC标准下的时间。若是这样解读,显然会和实际有一个时差问题。

有的读者会说,我在打印格式化时添加时区信息可以吗,我们实验一下:

In [ 19]: datetime.strftime(datetime.now,

'%Y-%m-%d %H:%M:%S %Z')

Out[ 19]: '2020-08-28 22:39:44 '

时区信息为空,所以没能解决问题。之所以时区信息会为空,是因为datetime.now时未给定 tzinfo 值。

所以,我们需要自己重新定义一个tzinfo,即实现一个tzinfo对象。

此类 BJinfo 继承tzinfo,然后实现其中的3个方法:

fromdatetime importtzinfo

classBJinfo(tzinfo):

"""BJinfo"""

defutcoffset(self, dt):

returntimedelta(hours= 8)

deftzname(self, dt):

return"UTC 8"

defdst(self, dt):

returntimedelta(hours= 8)

此时再打印当前时间时,赋上tzinfo值:

nowt = datetime.now(tz=BJinfo)

In [ 32]: In [ 6]: print(nowt)

2020-08-2822: 52: 20.328446+ 08: 00

再格式化打印时区信息:

In [ 36]: datetime.strftime(nowt,

...: '%Y-%m-%d %H:%M:%S %Z')

Out[ 36]: '2020-08-28 22:52:20 UTC 8'

透过时区信息 BJinfo 定义的三个方法,便能确认时间 2020-08-28 22:52:20 是比UTC快8个小时的时区下,所对应的一个时间。

总结

以上就是本专题对datetime模块核心对象的使用总结,大纲如下:

1 核心逻辑

2 date、time和datetime对象

3 基本运算

4 关于tzinfo

总结

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值