✍15 dateutil模块的使用
dateutil
- 与datetime,time一样也是时间处理模块
安装
pip install python-dateutil
- 主要有两个函数 : parser 和 rrule
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)) # <class 'datetime.datetime'="">
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