日常开发和数据分析中经常有用到处理日期数据的场景,比如会员到期验证、日期加减、顺序排列等等。python有一种专门的数据类型 <class 'datetime.datetime'>用于记录日期数据。像这样:
import datetime
timenow = datetime.datetime.now()
print('当前时间:', timenow)
print('该数据的类型:', type(timenow))
# 运行结果:
》》》当前时间: 2023-08-19 14:35:49.701482
》》》该数据的类型: <class 'datetime.datetime'>
相较一个字符串数据(如 “20230819”、“2023-8-19”等等), <class 'datetime.datetime'>数据类型体现出了强大的便利性,从而让我们能更好地处理日期数据。笔者自己总结的感受是,日期类型数据的便捷之处主要在于它能够实现日期的算数运算(加、减、大小比较),以及格式化输出,这些后面都会讲到。
今天的讲解主要围绕datetime模块主要的方法进行介绍,未能做到一一涵盖,旨在带大家达到学习上手和满足常用的目的。
对了,datetime是内置模块,直接import 即可。
第一部分,创建日期
获取当前时间:datetime.dateme.now()
该方法输出当前的日期,默认的日期样式为:【year-month-day hour:min:sec】
创建一个指定的时间:datetime.datetime.strptime()
指定一个任意的日期字符串,将其转化为 <class 'datetime.datetime'>类型。
strptime()方法有两个参数,分别是字符串的日期date_string,以及该日期的格式format。使用时像这样:
strdate1 = '2023-8-19'
strpdate1 = datetime.datetime.strptime(strdate1,'%Y-%m-%d')
strdate2 = '23/8/19'
strpdate2 = datetime.datetime.strptime(strdate2, '%y/%m/%d')
print('日期1:', strpdate1)
print('日期2:', strpdate2)
# 运行结果:
》》》日期1: 2023-08-19 00:00:00 # 没有指定小时、分钟等,默认为00
》》》日期2: 2023-08-19 00:00:00
其中,format用占位符的形式将字符串日期的样式写出来。
%Y:大写的年,如2023
%y:小写的年,如23
%m:月
%d:日
%H:小时
%M:分钟
%S:秒
使用strptime()方法,我们就能将任何str日期转成 <class 'datetime.datetime'>并参与后续的运算。
第二部分,日期的运算
日期加减:datetime.timedelta()
参数:days=n,指定加、减n天
直接用日期加、减这个timedelta(days=n),就能获取历史或未来的时间。
非常好理解,看个例子:
strdate1 = '2023-8-19'
strpdate1 = datetime.datetime.strptime(strdate1,'%Y-%m-%d')
# 获取7天前
before_7 = strpdate1 - datetime.timedelta(days=7)
#获取15天后
after_15 = strpdate1 + datetime.timedelta(days=15)
print('当前时间', strpdate1)
print('7天前:', before_7)
print('15天后:', after_15)
# 运行结果:
》》》当前时间 2023-08-19 00:00:00
》》》7天前: 2023-08-12 00:00:00
》》》15天后: 2023-09-03 00:00:00
日期比较:
大于:>
小于:<
等于:==
不等于:!=
strdate1 = '2023-8-19'
strpdate1 = datetime.datetime.strptime(strdate1,'%Y-%m-%d')
print('timenow:', timenow)
print('strpdate1:', strpdate1)
print('二者是否相等:', strpdate1 == timenow)
# 运行结果:
》》》timenow: 2023-08-19 15:00:32.675222
》》》strpdate1: 2023-08-19 00:00:00
》》》二者是否相等: False
第三部分,获取某个日期的时间属性
直接 “.属性” 获取,我们通过一个例子看看如何获取日期的年、月、日、小时、分钟、秒:
strdate1 = '2023-8-19,09:45:50'
strpdate1 = datetime.datetime.strptime(strdate1,'%Y-%m-%d,%H:%M:%S')
print('strpdate1:', strpdate1)
print('年:', strpdate1.year)
print('月:', strpdate1.month)
print('日:', strpdate1.day)
print('小时:', strpdate1.hour)
print('分钟:', strpdate1.minute)
print('秒:', strpdate1.second)
# 运行结果:
》》》strpdate1: 2023-08-19 09:45:50
》》》年: 2023
》》》月: 8
》》》日: 19
》》》小时: 9
》》》分钟: 45
》》》秒: 50
获取这些属性非常有用,比如我们可以通过获取当前时间的属性再加以判断,控制主程序在某个固定的时间段启动。
第四部分,转回字符串格式
相信你也看出来了,一个日期类型完整包含了从年到秒的数据,哪怕这些数据为0。这在某些展示场景下不太方便,所以我们需要将其转换成我们指定的字符串格式。
格式化时间:datetime.datetime.strftime()
strftime()方法也有两个参数,分别要转换的日期self,以及指定的格式format。format的写法和上面一致。看个例子:
strdate1 = '2023-8-19,09:45:50'
strpdate1 = datetime.datetime.strptime(strdate1,'%Y-%m-%d,%H:%M:%S')
strfdate = datetime.datetime.strftime(strpdate1, '%Y~%m~%d') # 指定一个格式
print('strfdate:', strfdate)
print('数据类型:', type(strfdate))
# 运行结果:
》》》strfdate: 2023~08~19
》》》数据类型: <class 'str'>
今天要讲的内容就这些。
最后扩展一个小思考,我们看到datetime模块在使用时经常是datetime.datetime.someting()的书写格式,这是什么原因呢?
这就是python中类和引用的概念。通过‘ctrl+左键’datetime方法不难发现,datetime模块源码是名为datetime.py的文件,而文件中有个datetime的同名类,我们上面使用的方法都在这个类里面,这就是“文件.类.方法”的引入逻辑。
你也可以尝试自己写一个.py模块,构建出类和方法,试着在其他文件中import引用看看。我建议你尝试一下,这有助于加深你对python类机制的理解。