Python日期的处理——datetime模块
本文作者:胡 婧
文字编辑:杨慧琳
技术总编:张学人
好消息!!!爬虫俱乐部将于2019年7月5日至7月8日在武汉举行首期Python编程技术定制培训。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python爬虫技术,并明确未来更进一步的学习方向。
详细培训大纲及报名方式,请点击文末阅读原文呦~
Python中用于处理日期和时间的模块包括time、datetime和calendar。在之前的推文中《Python之time模块详解》详细的介绍了time模块的相关内容,即主要处理的是时间类数据,例如时、分、秒等相关信息。今天小编将为大家介绍datetime模块的基本用法。datetime模块可处理时间、日期等数据,是date和time模块的集合,其总共定义6类:datetime.date、datetime.time、datetime.datetime、datetime.timedelta、datetime.tzinfo、datetime. timezone。tzinfo、timezone为时区类相关处理模块,本文不做过多讲解,而主要介绍前四类内容。
0. 前 言
在开始介绍datetime模块之前,先讲一下该模块下date、time以及datetime三个类的区别和联系。正如其表面意思一样,date是对日期进行处理,其最小的单位是天数;time是对时间进行处理,其最小的单位是微秒(一百万分之一秒);datetime则是上两个类的合集,其最小的单位是微秒,但是其必须包含日期的参数,可以省略时间的参数(省略的参数默认为0)。time不可以进行时间的加减运算,而datetime类和date类则可以结合timedelta进行时间以及日期的加减运算。当datetime省略时间的参数时,看起来和date表示出来的结果一致,实际上两者在时间加减运算时的精度不一致。具体区别,可以通过以下程序输出的结果进行比较:
import datetime
a1=datetime.time(8,12,4,3)
a2=datetime.time(8) #其他参数省略时默认为0
a1>a2
b=datetime.date(2019,6,10)
print(b.toordinal())
print(b.timetuple())
c1=datetime.datetime(2019,6,10)
c2=datetime.datetime.today()
print(c1.toordinal(),c2.toordinal())
print(c1.timetuple(),c2.timetuple()) #c1和c2的时间戳看起来一样,但是时间元组不同
delta=datetime.timedelta(days=1,hours=2,minutes=3,seconds=4)
newb=b+delta
newc=c1+delta
print(newb,newc)
其中newb只比b增加了1天,因为date类时间的最小单位为天数,所以delta中的小时,分钟,秒钟在与date类时间相加时自动忽略掉。而newc则是比c1增加了一天零2小时3分4秒。
1. datetime.date
datetime.date用于对于日期的处理,其中有三个参数:year、month、day。其中想要获取当前日期,以及返回当前日期的年、月、日,程序如下所示:
import datetime
a=datetime.date.today()
print(a.year)
print(a.month)
print(a.day)
同时,我们还可以改变日期的格式,将其变成时间戳或是时间元组格式。程序如下:
a.toordinal() #变为时间戳
a.timetuple() #变为时间元组
a.timetuple().tm_year #返回其中的年份
a.__str__() #简单的获得日期的字符串
a.strftime("%Y%m%d") #将日期以指定的形式输出
a.__format__('%Y-%m-%d')
a.ctime()
这里可以注意到,当将其转换为时间元组时,会自动生成小时、分钟、秒钟的参数,并将其设置为0。同时,我们不仅可以将日期换成其他格式,也可以比较两个日期的大小以及算两个日期相隔多少天。在进行比较时,如果是真则返回“True”,如果是假则返回“Flase”。具体程序如下所示:
b=datetime.date(1997,3,18)
a<b
a>b
c=a-b
c.days
2. datetime.time
datetime.time用于对于时间的处理,其中有五个参数:hour、minute、second、microsecond(毫秒)以及tzinfo(时区),必须包含时间参数,其他可以省略,省略时视该参数的取值为0。
其基本用法与date的相关用法类似,具体用法如以下程序所示:
a=datetime.time(11,31,00,00)
print(a.hour,a.minute,a.second,a.microsecond,a.tzinfo)
a.__str__() #简单获取时间的字符串
a.strftime("%H:%M:%S")
a.__format__('%H-%M-%S')
b=datetime.time(12,22,12,23)
print(a<b)
print(a>b)
这里的a和b不能转化为时间戳或是时间元组,因为其不包含日期参数。也不能计算a与b之间的时间间隔。
3. datetime.datetime
datetime模块中的datetime类可以看作是上两类的合集。datetime.datetime参数包括:year、month、day、hour、minute、second、microsecond、tzinfo(时区)。而在具体的使用过程中,必须要出现的参数为:year、month、day。其他参数如果不需要可以省略不写。程序如下:
from datetime import datetime as dt
a=dt.now() #本地当前时间
b=dt(2018,5,26) #没写的参数默认为0
min=dt.min #datetime模块中datetime类可表示的最小时间
max=dt.max #datetime模块中datetime类可表示的最大时间
print(min)
print(max)
b.toordinal() #变为时间戳
b.timetuple() #变为时间元组
print(a-b)
在datetime类进行日期的相减时,得到的是精确到秒的两者的时间差。datetime模块中的datetime类和time模块的参数看起来类似,datetime类中的时间也的确可以转换为time模块中的表示形式,即时间戳以及时间元组。而对于日期时间的比较和加减运算,只能通过datetime模块进行,time模块不支持日期时间之间的比较和加减运算。
表1 各参数的取值范围
参数 | 取值范围 |
year | 0001-9999 |
month | 1-12 |
day | 1-30(31)[2月则以其实际天数为准] |
hour | 0-24 |
minute | 0-60 |
second | 0-60 |
microsecond | 0-1000000 |
4. datetime. timedelta
如上图所示,datetime. timedelta表示的是两个date或者datetime的时间差。我们可以运用datetime. timedelta对时间进行相应的加减处理。例如,可以运算得出已知的日期加上300天的具体日期为多少。其参数为:days、seconds、microseconds、milliseconds、minutes、hours、weeks。其只能储存days、seconds、microseconds相关信息,其他信息则自动转换为这三个信息储存起来。具体用法如下所示:
a=dt.now() #本地当前时间
print(a)
delta=datetime.timedelta(days=1,hours=2,minutes=30,seconds=20)
print(delta)
newtime=a+delta #当前时间加上1一天2小时30分20秒的时间
print(newtime)
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。