Python日期时间模块Dateutil

本文详细介绍了Python的dateutil模块,包括其扩展内置datetime的功能,主要模块parser进行字符串日期解析,rrule生成按规则的datetime,以及relativedelta实现日期时间偏移。通过实例展示了如何灵活运用这些工具处理日期和时间计算。
摘要由CSDN通过智能技术生成



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('20231129'))            # 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('20231129'), until=parser.parse('20231203')).count())    # 5
# 不足N个月的,按N个月计算;不满整月的,按N-1个月计算
print(rrule.rrule(rrule.MONTHLY, dtstart=parser.parse('20231101'), until=parser.parse('20240115')).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'))   # 20231122
# relativedelta.relativedelta()计算上周
print(datetime.strftime(datetime.now() - relativedelta.relativedelta(weeks=1), "%Y%m%d"))   # 20231122

# 计算上月初、计算上N月初
print(datetime.strftime(datetime.now() - relativedelta.relativedelta(months=1), "%Y%m01"))   # 20231001
# 计算上月末、计算上N月末
print(datetime.strftime(datetime.strptime(datetime.now().strftime('%Y-%m-01'), '%Y-%m-%d') - relativedelta.relativedelta(days=1), '%Y%m%d'))   # 20231031

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 有许多用于日期分析和处理的模块,其中最常用的是 datetime 和 dateutildatetime 模块提供了日期时间的类,可以用来执行各种日期时间的操作,例如计算两个日期之间的时间差、将日期时间格式化为字符串等等。以下是一些 datetime 的示例代码: ```python import datetime # 获取当前日期时间 now = datetime.datetime.now() # 输出当前日期时间 print("当前日期时间是:") print(now) # 计算两个日期之间的时间date1 = datetime.date(2021, 1, 1) date2 = datetime.date(2021, 1, 10) delta = date2 - date1 print("两个日期之间的时间差是:") print(delta.days) # 将日期时间格式化为字符串 now_str = now.strftime("%Y-%m-%d %H:%M:%S") print("当前日期时间的字符串格式是:") print(now_str) # 将字符串转换为日期时间 date_str = "2021-01-01" date = datetime.datetime.strptime(date_str, "%Y-%m-%d") print("字符串转换为日期时间:") print(date) ``` dateutil 模块是一个第三方库,提供了一些更高级的日期时间处理功能,例如可以处理各种不同的日期时间格式、可以解析出日期时间中的各个部分等等。以下是一个 dateutil 的示例代码: ```python from dateutil import parser # 将字符串转换为日期时间 date_str = "Fri Jan 01 2021 00:00:00 GMT-0800 (Pacific Standard Time)" date = parser.parse(date_str) print("字符串转换为日期时间:") print(date) # 解析出日期时间中的各个部分 year = date.year month = date.month day = date.day hour = date.hour minute = date.minute second = date.second print("解析出日期时间中的各个部分:") print(year, month, day, hour, minute, second) ``` 除了 datetime 和 dateutil,还有许多其他的日期处理库,例如 arrow、pendulum 等等。不同的库适用于不同的情况,需要根据具体需求来选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值