✍15 dateutil模块的使用


dateutil

  • 与datetime,time一样也是时间处理模块

安装

pip install python-dateutil
  • 主要有两个函数 : parserrrule

parser 函数使用

  • parser 是根据字符串解析成 datetime
  • 字符串可以很随意,可以用时间日期的英文单词,可以用横线、逗号、空格等做分隔符
  • 没指定时间默认是0点,没指定日期默认是今天,没指定年份默认是今年

注意 : 这种方式很随意, 你传入的时间它会自动判断年月日(超过月份范围,超出日期范围等), 但如果你传入的时间不符合现实则会报错

测试 :

from dateutil.parser import parse
from dateutil import rrule

res = parse("25-11-2024 12:15:12")
print(res)  # 2024-11-25 12:15:12
print(type(res))  # 
print(parse("12"))  # 2021-07-12 00:00:00
print(parse("01/12"))  # 2021-01-12 00:00:00
# print(parse("25/12"))  # ValueError: month must be in 1..12
print(parse("2222"))  # 2222-07-28 00:00:00
print(parse("2020-01-12"))  # 2020-01-12 00:00:00
print(parse("2020/01/12"))  # 2020-01-12 00:00:00
print(parse("20200112"))  # 2020-01-12 00:00:00
print(parse("02-16-2024"))  # 2024-02-16 00:00:00
print(parse("02-16/2024"))  # 2024-02-16 00:00:00
print(parse("25-11-2024"))  # 2024-11-25 00:00:00 (当前面的月份超过12时,parser会自动识别月和日)
# print(parse("2020-25-11"))  # ValueError: month must be in 1..12(当年份放在前面时,只能按年-月-日的顺序)
  • 当分隔符为逗号时,只有月-日时,要把月放在前面, 有年份时,年份要放在后面
>>> parse("3,15")
datetime.datetime(2018, 3, 15, 0, 0)

只识别到了前面的日,月将本月11月作为默认月
>>> parse("15,3")
datetime.datetime(2018, 11, 15, 0, 0)

>>> parse("3,15,2018")
datetime.datetime(2018, 3, 15, 0, 0)

>>> parse("2018,3,15")
ValueError: ('Unknown string format:', '2018,3,15')
  • parser还可以识别英文的月、日
>>> parse("Mar 15")
datetime.datetime(2018, 3, 15, 0, 0)

没有空格也可以
>>> parse("Mar15")
datetime.datetime(2018, 3, 15, 0, 0)

>>> parse("15 Mar")
datetime.datetime(2018, 3, 15, 0, 0)

>>> parse("Mar 1st")
datetime.datetime(2018, 3, 1, 0, 0)

>>> parse("Mar 15 2018")
datetime.datetime(2018, 3, 15, 0, 0)

>>> parse("2018 Mar15")
datetime.datetime(2018, 3, 15, 0, 0)

rrule

  • rrule 是根据定义的规则来生成 datetime
  • 参数解析 :
rrule(self, freq, dtstart=None, interval=1, wkst=None,count=None, until=None, bysetpos=None,bymonth=None, bymonthday=None, byyearday=None, byeaster=None,byweekno=None, byweekday=None, byhour=None, byminute=None, bysecond=None,cache=False)
参数 说明
freq 单位(年-月-日-周-时-分-秒) (下面列出具体参数)
dtstart 开始时间
until 结束时间
wkst 以周为单位开始时间
interval 时间间隔
count 指定生成 datetime 的个数
by xxx 指定匹配的周期(比如只匹配周一,周二,哪个小时,哪分钟等等)(下面列出)

参数 :

freq (单位)

YEARLY  # 年
MONTHLY  # 月
WEEKLY  # 周
DAILY  # 日
HOURLY  # 时
MINUTELY  # 分
SECONDLY  # 秒

by xxx

bysetpos=None,bymonth=None, bymonthday=None, byyearday=None, byeaster=None,byweekno=None, byweekday=None, byhour=None, byminute=None, bysecond=None

测试

>>> from dateutil import rrule

# 生成一个连续的日期列表
>>> list(rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0), 
datetime.datetime(2018, 11, 2, 0, 0), 
datetime.datetime(2018, 11, 3, 0, 0), 
datetime.datetime(2018, 11, 4, 0, 0), 
datetime.datetime(2018, 11, 5, 0, 0)]

# 间隔一天
>>> list(rrule.rrule(rrule.DAILY,interval=2,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0), 
datetime.datetime(2018, 11, 3, 0, 0), 
datetime.datetime(2018, 11, 5, 0, 0)]

# 只保留前3个元素
>>> list(rrule.rrule(rrule.DAILY,count=3,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 1, 0, 0), 
datetime.datetime(2018, 11, 2, 0, 0), 
datetime.datetime(2018, 11, 3, 0, 0)]

# 只要周一的
>>> list(rrule.rrule(rrule.DAILY,byweekday=rrule.MO,dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 5, 0, 0)]

# 只要周六和周日的
>>> list(rrule.rrule(rrule.DAILY,byweekday=(rrule.SA,rrule.SU),dtstart=parse('2018-11-1'),until=parse('2018-11-5')))
[datetime.datetime(2018, 11, 3, 0, 0), 
datetime.datetime(2018, 11, 4, 0, 0)]

# 以月为间隔
>>> list(rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-7-30')))
[datetime.datetime(2018, 3, 15, 0, 0), 
datetime.datetime(2018, 4, 15, 0, 0), 
datetime.datetime(2018, 5, 15, 0, 0), 
datetime.datetime(2018, 6, 15, 0, 0), 
datetime.datetime(2018, 7, 15, 0, 0)]
  • 计算时间差
# 两个日期相差10天
>>> rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=parse('2018-11-10')).count()
10

# 某个日期到今天相差多少天
>>> rrule.rrule(rrule.DAILY,dtstart=parse('2018-11-1'),until=datetime.date.today()).count()
10