Python时间模块实用总结

本篇思维导图如下:

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]: from datetime import date,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-28 22: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 not match format '%Y/%m/%d %H:%M:%S'

3 基本运算

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

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

首先,导入timedelta类:

In [15]: from datetime import timedelta                   

直接使用当前时间减去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小时等。

比如打印当前时间时,

```pythonIn [6]: print(datetime.now())2020-08-28 22: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个方法:

from datetime import tzinfo

class BJinfo(tzinfo):    '''BJinfo'''    def utcoffset(self, dt):        return timedelta(hours=8)

    def tzname(self, dt):        return 'UTC 8'

    def dst(self, dt):        return timedelta(hours=8)

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

nowt = datetime.now(tz=BJinfo())
In [32]: In [6]: print(nowt)                               
2020-08-28 22: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

  • 总结

(0)

相关推荐

  • 【万字长文】详解Python时间处理模块-datetime

    学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分.日期:年月日,如 20210612时间:时分秒,如 20:4 ...

  • 如何在Python中操作日期和时间

    编写Python程序,处理日期和时间经常会遇到,幸好Python本身集成了很多日期.时间相关的模块,让这件繁琐的工作变的方便.本文介绍Python中功能强大的datetime模块. datetime模 ...

  • 太赞了!最全的Python 处理日期与时间的全面总结!

    作者丨钱魏Way 链接 https://www.biaodianfu.com/python-datetime.html Python的时间处理模块在日常的使用中用的较多多,但是使用的时候基本上都是要查 ...

  • Python时间模块包含什么?详细介绍!

    在编写代码的过程中,我们经常需要与时间打交道,所以说掌握时间处理模块及方法很重要,那么Python常用时间模块有哪些呢?这几个很关键! 1. time模块 time模块下有很多函数可以日期和时间的处理 ...

  • python笔记46-史上最强大最好用的python日志模块nb_log

    前言 python的日志模块如何封装一值都是一个头疼的问题,封装的不好总是会出现重复打印等头疼问题. 现在终于找到一个最好用的日志模块nb_log,此日志模块由这位大佬开发的https://www.c ...

  • python random模块

    本篇介绍比较常用的一个标准模块,random. 这是一个随机数模块,可以用来随机生成随机数,经常被用于数学.游戏.算法等等上面. 1.导入random模块 要使用此模块,要先导入. import ra ...

  • python logging模块的几点总结

    http://www.voidcn.com/article/p-ctmbnbwp-bbo.html 关于使用python logging模块的几点总结 使用python的标准日志模块logging可以 ...

  • 第26天:Python os 模块详解

    第26天:Python os 模块详解

  • 第27天:Python shutil 模块

    shutil 可以看作 sh + util,即 shell 工具之意,该模块提供了一些针对文件和文件夹的高级操作,如:拷贝.删除.移动等,shutil 模块是对 os 模块的补充. 1 文件和文件夹操 ...

  • 第29天:Python queue 模块详解

    queue 模块即队列,特别适合处理信息在多个线程间安全交换的多线程程序中.下面我们对 queue 模块进行一个详细的使用介绍. 1 queue 模块定义的类和异常 queue 模块定义了以下四种不同 ...

  • 第30天:Python collections 模块

    第30天:Python collections 模块