Python 常用日期处理 -- calendar 与 dateutil 模块的使用
本文紧承上一篇Python常用日期处理,因制于篇幅的大小需求才临时分立新篇,这里要简单提到calendar和dateutil模块的使用,其中calendar是Python内置的。相比于上一篇而言,此处主旨会更明确一些,只记录三个应用案例,分别是
- 用dateutil灵活的解析datetime字符串
- 给定起始日期后的连续日期
- 给定起始日期后连续的月末日期
dateutil灵活的解析datetime字符串
使用Python内容的date或datetime,构造它们的实例时需要逐个的传入年月日或时分秒,或者要调用fromisoformat()方法解析严格的字符串表示格式。而dateutil.parser的parse()方法就显得特别的聪明和随意,它可以智能的解析更丰富的字符串表示方式。详细的支持格式请参考官方文档的parseexamples,恐怕官方文档也未列举完全,只要觉得合理的时间字符串就可以尝试去解析。下方是一些例子
>>>fromdateutil.parserimportparse >>> >>>parse('2018-02-28') datetime.datetime(2018,2,28,0,0) >>>parse('2018-02-28T12:08:23') datetime.datetime(2018,2,28,12,8,23) >>>parse('2018-02-28T12:08:23PM')#下午 datetime.datetime(2018,2,28,12,8,23) >>>parse('2018-02-28T12:08:23+05:00')#加上时区偏移 datetime.datetime(2018,2,28,12,8,23,tzinfo=tzoffset(None,18000)) >>>parse('Jan18,2018') datetime.datetime(2018,1,18,0,0) >>>parse('Oct.10,200810:43amCST')#加上时区 datetime.datetime(2008,10,10,10,43,tzinfo=tzlocal()) >>>parse('WedJul0817:08:48GMT2009') datetime.datetime(2009,7,8,17,8,48,tzinfo=tzutc()) >>>parse("09-25-2003") datetime.datetime(2003,9,25,0,0) >>>parse("13-02-2003")#第一段大于12不可能是月份,所以推断为日期 datetime.datetime(2003,2,13,0,0) >>>parse('09:23pm') datetime.datetime(2019,4,30,21,23)
parser.parse()返回的总是datetime类型,这也很好理解,因为datetime有完整的时间信息,可由此得到date或time实例。
给定起始日期后的连续日期
从一个给定日期一天天往后推可以直接用Python内置的datetime(date和timedelta),还用不上calendar模块
>>>fromdatetimeimportdate,timedelta >>>start_date=date(2018,2,25) >>>foriinrange(1,10): ...print(start_date+timedelta(days=i)) ... 2018-02-26 2018-02-27 2018-02-28 2018-03-01 2018-03-02 2018-03-03 2018-03-04 2018-03-05 2018-03-06
使用timedelta来计算日期偏移只能支持以下的度量
timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
不能按月,年来换算,而dateutil.relativedelta就更强大了,看下它的构造函数
relativedelta(dt1=None,dt2=None,years=0,months=0,days=0,leapdays=0,weeks=0,hours=0,minutes=0,seconds=0,microseconds=0,year=None,month=None,day=None,weekday=None,yearday=None,nlyearday=None,hour=None,minute=None,second=None,microsecond=None)
我们可以换用relativedelta来重写上面的代码
>>>fromdatetimeimportdate >>>fromdateutil.relativedeltaimportrelativedelta >>>start_date=date(2018,2,25) >>>foriinrange(1,10): ...print(start_date+relativedelta(days=i)) ... 2018-02-26 2018-02-27 2018-02-28 2018-03-01 2018-03-02 2018-03-03 2018-03-04 2018-03-05 2018-03-06
如果想要推算下一个,下一个月,或下下年就需要用relativedelta。
给定起始日期后连续的月末日期
假如用relativedelta按月推算日期的话就要涉及到calendar模块了,因为无论30天往下推算或是relativedelta(months=1)得到的都可能不是自己想要的结果。例如
- 2019-01-30+relativedelta(months=1)是2019-02-28
- 2019-02-28+relativedelta(months=1)是2019-03-28
日期部分飘忽不定,这种按月推演出的结果没多大意思,一般来说我们可能需要的是每个月月末日期,可以使用calendar来确定指定年月的最小和最大日期。
>>>fromdatetimeimportdate >>>fromdateutil.relativedeltaimportrelativedelta >>>fromcalendarimportmonthrange >>> >>>monthend=date(2019,1,31) >>>foriinrange(1,10): ...dd=monthend+relativedelta(months=i) ...dd=dd.replace(day=monthrange(dd.year,dd.month)[1]) ...print(dd) ... 2019-02-28 2019-03-31 2019-04-30 2019-05-31 2019-06-30 2019-07-31 2019-08-31 2019-09-30 2019-10-31
Python自带的calendar模块还有许多好玩的函数,如对星期,月份的遍历,真正的日历输出为文本或HTML代码的功能,详情请见PythonCALENDARTutorialwithExample.
来份简单的例子
>>>importcalendar >>>c=calendar.TextCalendar(calendar.SUNDAY) >>>str=c.formatmonth(2019,4) >>>print(str) April2019 SuMoTuWeThFrSa 123456 78910111213 14151617181920 21222324252627 282930
显示出与bash命令cal-h42019一样的内容。
以上就是Python日期处理--calendar与dateutil模块的详细内容,更多关于python日期处理的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。