Python 常用日期处理 -- calendar 与 dateutil 模块的使用


Posted in Python onSeptember 02, 2020

本文紧承上一篇 Python 常用日期处理,因制于篇幅的大小需求才临时分立新篇,这里要简单提到 calendar 和 dateutil 模块的使用,其中 calendar 是 Python 内置的。相比于上一篇而言,此处主旨会更明确一些,只记录三个应用案例,分别是

  • 用 dateutil 灵活的解析 datetime 字符串
  • 给定起始日期后的连续日期
  • 给定起始日期后连续的月末日期

dateutil 灵活的解析 datetime 字符串

使用 Python 内容的 date 或 datetime, 构造它们的实例时需要逐个的传入年月日或时分秒,或者要调用 fromisoformat() 方法解析严格的字符串表示格式。而 dateutil.parser 的 parse() 方法就显得特别的聪明和随意,它可以智能的解析更丰富的字符串表示方式。详细的支持格式请参考官方文档的 parse examples,恐怕官方文档也未列举完全,只要觉得合理的时间字符串就可以尝试去解析。下方是一些例子

>>> from dateutil.parser import parse
>>>
>>> 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('Jan 18, 2018')
datetime.datetime(2018, 1, 18, 0, 0)
>>> parse('Oct. 10, 2008 10:43am CST') # 加上时区
datetime.datetime(2008, 10, 10, 10, 43, tzinfo=tzlocal())
>>> parse('Wed Jul 08 17:08:48 GMT 2009')
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 模块

>>> from datetime import date, timedelta
>>> start_date = date(2018, 2, 25)
>>> for i in range(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 来重写上面的代码

>>> from datetime import date
>>> from dateutil.relativedelta import relativedelta
>>> start_date = date(2018, 2, 25)
>>> for i in range(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 来确定指定年月的最小和最大日期。

>>> from datetime import date
>>> from dateutil.relativedelta import relativedelta
>>> from calendar import monthrange
>>>
>>> monthend = date(2019, 1, 31)
>>> for i in range(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 代码的功能,详情请见Python CALENDAR Tutorial with Example.

来份简单的例子

>>> import calendar
>>> c = calendar.TextCalendar(calendar.SUNDAY)
>>> str = c.formatmonth(2019, 4)
>>> print(str)
   April 2019
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
 7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

显示出与 bash 命令 cal -h 4 2019 一样的内容。

以上就是Python 日期处理 -- calendar 与 dateutil 模块的详细内容,更多关于python 日期处理的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现linux服务器批量修改密码并生成execl
Apr 22 Python
Python中除法使用的注意事项
Aug 21 Python
实例讲解Python中的私有属性
Aug 21 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
python MySQLdb使用教程详解
Mar 20 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
Python实现学生管理系统(面向对象版)
Jun 24 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 #Python
详解Python中的路径问题
Sep 02 #Python
python dict如何定义
Sep 02 #Python
python基本算法之实现归并排序(Merge sort)
Sep 01 #Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 #Python
Python内置函数property()如何使用
Sep 01 #Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 #Python
You might like
PHP PDO函数库详解
2010/04/27 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
php函数实现判断是否移动端访问
2015/03/03 PHP
php字符串函数学习之substr()
2015/03/27 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
js字符串转换成xml对象并使用技巧解读
2013/04/18 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
Jquery删除css属性的简单方法
2016/12/04 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
numpy中矩阵合并的实例
2018/06/15 Python
Python Pillow(PIL)库的用法详解
2020/09/19 Python
python搜索算法原理及实例讲解
2020/11/18 Python
Python绘制数码晶体管日期
2021/02/19 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
C#里面如何判断一个Object是否是某种类型(如Boolean)?
2016/02/10 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
市场营销大学生职业规划书
2014/02/25 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS