大家好,欢迎来到IT知识分享网。
Dateutil模块
1、Dateutil库简介
dateutil模块是由Gustavo Niemeyer在2003年编写而成的对日期时间操作的第三方模块
dateutil模块对Python内置的datetime模块进行扩展时区和解析
dateutil库主要有两个模块:parser和rrule,其中parser可以将字符串解析成datetime,而rrule则是根据定义的规则来生成datetime
dateutil模块特点:
- 能够计算日期时间相对增量,例如下周、下个月、明年、每月的最后一周等
- 可以计算两个给定日期和/或日期时间对象之间的相对增量
- 支持多种时区格式文件的解析,例如UTC时区、TZ时区等
- 支持包括RFC字符串或其他任何字符串格式的通用日期时间解析
官方文档:http://labix.org/python-dateutil
安装:
pip install python-dateutil
2、Dateutil库常用模块
dateutil库常用模块有三个:parser、rrule和relativedelta
from dateutil import parser, rrule, relativedelta # dateutil.parser:将字符串解析成datetime # dateutil.rrule:将参数输出datetime.datetime格式的时间 # dateutil.relativedelta:日期时间偏移量
2.1、parser
parser用于将字符串解析成datetime,字符串可以很随意,可以用日期时间的英文单词,可以用横线、逗号、空格等做分隔符
''' parser.parse(str) - str:字符串 '''
parser使用示例如下:
# 没指定时间默认0点,没指定日期默认当天,没指定年份默认当年 # 当年份放在前面时,只能按年月日的顺序 print(parser.parse('2023-11-29')) # 2023-11-29 00:00:00 print(parser.parse('10:45:52')) # 2023-11-29 10:45:52 print(parser.parse('')) # 2023-11-29 00:00:00 print(parser.parse('2023.11.29')) # 2023-11-29 00:00:00 print(parser.parse('2023/11/29')) # 2023-11-29 00:00:00 # fuzzy:开启模糊匹配,过滤无法识别的时间日期字符 print(parser.parse('Today is 11-29 10:45, I feel good.', fuzzy=True)) # 2023-11-29 10:45:00 # 当只有月日时,parser会将分隔符前面的数字解析为月份,后面的为日 # 当有年份时,在前面的月份超出范围时,会自动判断哪个是月哪个是日 # 11.29解析结果异常,11-29、11/29可正常解析 print(parser.parse('11-29')) # 2023-11-29 00:00:00 print(parser.parse('11/29/2023')) # 2023-11-29 00:00:00 # 当前面的月份超过12时,parser会自动识别月和日 print(parser.parse('29/11/2023')) # 2023-11-29 00:00:00 # 当分隔符为逗号时,只有月日时,要把月放在后面 # 当分隔符为逗号时,有年份时,年份要放在后面,要把月放在前面 print(parser.parse('29,11')) # 2023-11-29 00:00:00 print(parser.parse('11,29,2023')) # 2023-11-29 00:00:00 # 识别英文的月、日 print(parser.parse('November 29')) # 2023-11-29 00:00:00 print(parser.parse('November 1st')) # 2023-11-01 00:00:00 print(parser.parse('November 29 2023')) # 2023-11-29 00:00:00 print(parser.parse('2023 November29')) # 2023-11-29 00:00:00 print(parser.parse('11:45 AM')) # 2023-11-29 11:45:00
2.2、rrule
rrule用于将字符串解析成datetime
''' rrule.rrule(freq,dtstart,interval,wkst,count,until,by) - freq:单位,可选的值为YEARLY、MONTHLY、WEEKLY、DAILY、HOURLY、MINUTELY、SECONDLY,即年月日周时分秒 - dtstart、until:开始和结束时间,时间格式datetime.datatime类型 - interval:间隔 - wkst:周开始时间 - count:生产时间的个数 - by:指定匹配的周期,例如,byweekday=(MO,TU):只有周一周二的匹配,取值如下: - bysetpos:必须为整数或者整数序列,设置匹配的周期频率 - bymonth:设置匹配的月份 - bymonthday:设置匹配每月的日期 - byyearday:设置匹配每年的天数 - byweekno:设置匹配第几周 - byweekday:MO,TU,WE,TH,FR,SA,SU - byhour:设置匹配小时 - byminute:设置匹配分钟 - bysecond:设置匹配秒数 '''
rrule使用示例如下:
# 生成一个连续的日期列表 print(list(rrule.rrule(rrule.DAILY, dtstart=parser.parse('2023-11-29'), until=parser.parse('2023-12-3')))) ''' [datetime.datetime(2023, 11, 29, 0, 0), datetime.datetime(2023, 11, 30, 0, 0), datetime.datetime(2023, 12, 1, 0, 0), datetime.datetime(2023, 12, 2, 0, 0), datetime.datetime(2023, 12, 3, 0, 0)] ''' # 间隔一天 print(list(rrule.rrule(rrule.DAILY, interval=2, dtstart=parser.parse('2023-11-29'), until=parser.parse('2023-12-3')))) ''' [datetime.datetime(2023, 11, 29, 0, 0), datetime.datetime(2023, 12, 1, 0, 0), datetime.datetime(2023, 12, 3, 0, 0)] ''' # 只保留前3个元素 print(list(rrule.rrule(rrule.DAILY, count=3, dtstart=parser.parse('2023-11-29'), until=parser.parse('2023-12-3')))) ''' [datetime.datetime(2023, 11, 29, 0, 0), datetime.datetime(2023, 11, 30, 0, 0), datetime.datetime(2023, 12, 1, 0, 0)] ''' # 只取周六和周日日期时间 print(list(rrule.rrule(rrule.DAILY, byweekday=(rrule.SA, rrule.SU), dtstart=parser.parse('2023-11-29'), until=parser.parse('2023-12-3')))) ''' [datetime.datetime(2023, 12, 2, 0, 0), datetime.datetime(2023, 12, 3, 0, 0)] ''' # 以月为间隔,生成3个月 print(list(rrule.rrule(rrule.MONTHLY, count=3, dtstart=parser.parse('2023-11-01')))) ''' [datetime.datetime(2023, 11, 1, 0, 0), datetime.datetime(2023, 12, 1, 0, 0), datetime.datetime(2024, 1, 1, 0, 0)] ''' # rrule计算日期时间差 # rrule可计算出两个datetime对象间相差的年月日等时间数量 print(rrule.rrule(rrule.DAILY, dtstart=parser.parse(''), until=parser.parse('')).count()) # 5 # 不足N个月的,按N个月计算;不满整月的,按N-1个月计算 print(rrule.rrule(rrule.MONTHLY, dtstart=parser.parse(''), until=parser.parse('')).count()) # 3
2.3、relativedelta
relativedelta主要用于日期时间偏移
''' relativedelta.relativedelta() '''
relativedelta使用示例如下:
# datetime.timedelta与relativedelta.relativedelta() from datetime import datetime, timedelta # timedelta仅支持:weeks、days、hours、minutes、seconds,不支持月、年 # datetime.timedelta()计算上周 print(datetime.strftime(datetime.now() - timedelta(weeks=1), '%Y%m%d')) # # relativedelta.relativedelta()计算上周 print(datetime.strftime(datetime.now() - relativedelta.relativedelta(weeks=1), "%Y%m%d")) # # 计算上月初、计算上N月初 print(datetime.strftime(datetime.now() - relativedelta.relativedelta(months=1), "%Y%m01")) # # 计算上月末、计算上N月末 print(datetime.strftime(datetime.strptime(datetime.now().strftime('%Y-%m-01'), '%Y-%m-%d') - relativedelta.relativedelta(days=1), '%Y%m%d')) #
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/109926.html