本期导读
本期给大家介绍一个日期处理库 -- dateutil。该库是 datetime 模块的扩展和加强,具有更完善的时间处理机制,支持模糊匹配,在实际应用过程中比较常用的是 dateutil 的 parser 和 rrule 两个模块,parser 是根据字符串解析成 datetime,rrule 是根据定义的规则来生成 datetime。
前方高能!!!
1. dateutil 安装
pip install python-dateutil
可以直接在在命令窗口安装,也可以在编译器终端安装
2. prase 方法
该模块提供了通用的日期/时间字符串解析器,能够解析大多数格式的日期/时间,即使对于不明确的日期也可以返回datetime对象。
如果省略日期/时间,则将应用以下规则:
- 如果未指定AM或PM,则假定使用24小时制,但是,如果指定了AM或PM,则必须指定12小时制的一个小时(0 <=小时<= 12)。
- 如果省略了时区,则返回时区未使用的日期时间。
- 如果缺少任何其他元素,则将它们从传递给参数default的datetime.datetime对象中获取。如果这导致天数超过每月的有效天数,则该值取该月最后一天。
实例:
2.1 只输入年份, 默认日期是当前日期
time0 = parse('2021') # time0 = 2021-02-28 12:00:00
2.2 输入年、月、日、小时
time0 = parse('2021-2-28 12') # time0 = 2021-02-28 12:00:00
2.3 输入年、月、小时、分钟
time0 = parse('2021-2 12:12') # time0 = 2021-02-28 12:12:00
2.4 AM/PM
time0 = parse('2021-02-28T5:08:20AM') # time0 = 2021-02-28 05:08:20 time0 = parse('2021-02-28T5:08:20PM') # time0 = 2021-02-28 17:08:20
2.5 以 - 为分割日期
time0 = parse('2021-2-28') # time0 = 2021-02-28 00:00:00
2.6 以 / 为分割日期
time0 = parse('2021/2/28') # time0 = 2021-02-28 00:00:00
2.7 无分割日期
time0 = parse('20210228') # time0 = 2021-02-28 00:00:00
2.8 美式日期
time0 = parse('28nd,Feb,2021') # time0 = 2021-02-28 00:00:00
2.9 fuzzy_with_tokens
如果参数为真,解析器将返回一个元组,其中第一个元素是已解析的datetime,datetime datetimestamp,第二个元素是一个元组,包含被忽略的字符串部分。
time0 = parse("Today is January 1, 2021 at 8:21:00AM", fuzzy_with_tokens=True) # time0 = (datetime.datetime(2021, 1, 1, 8, 21), ('Today is ', ' ', ' ', 'at '))
3. rrule 方法
函数原型如下:
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: 时间基单元。取值-YEARLY, MONTHLY, WEEKLY,DAILY, HOURLY, MINUTELY, SECONDLY(年月日周时分秒)#
- dtstart: 开始时间
- interval: 每次频率迭代之间的间隔。例如,当使用YEARLY时,间隔2表示每两年一次,而对于HOURLY,则意味着每2小时一次。预设时间间隔是1。
- wkst: 星期开始的一天。必须是MO,TU,WE常量之一,或者是整数,指定一周中的第一天。
- count: 生成日期个数
- until: 结束时间
- byxxx: 指定匹配的周期。比如byweekday=(MO,TU)则只有周一周二的匹配。byweekday可以指定MO,TU,WE,TH,FR,SA,SU。即周一到周日。
- cache: 布尔值,指定启用或禁用结果缓存。
实例一:
起始时间:2021-02-28 09:00:00 隔天统计一个时间,一共统计5个时间
timelst = list(rrule(DAILY, interval=2, count=5,dtstart=parse('20210228T090000'))) # [datetime.datetime(2021, 2, 28, 9, 0), # datetime.datetime(2021, 3, 2, 9, 0), # datetime.datetime(2021, 3, 4, 9, 0), # datetime.datetime(2021, 3, 6, 9, 0), # datetime.datetime(2021, 3, 8, 9, 0)]
实例二:
根据 recurrenceRules 规则输出排班日期
排班规则:2021-09-08至2021-09-30期间,每周二、四、六 09:00-17:00
data = { "eventInterval": { "endTime": "2021-09-08T09:00-17:00", "startTime": "2021-09-08T09:00-17:00" }, "occurrenceDate": "2021-09-08T09:00-17:00", "recurrenceRules": [ { "interval": 1, "daysOfTheWeek": [2,4,6], "recurrenceEnd": "2021-09-30T09:00-17:00" } ] }
生成日期:
# 周一到周日字典,对应daysOfTheWeek使用 week = {1:SU,2:MO,3:TU,4:WE,5:TH,6:FR,7:SA} weekday = set() # 遍历daysOfTheWeek获取周集合 for d in data['recurrenceRules'][0]['daysOfTheWeek']: weekday.add(week[d]) # 起始日期 dtstart = parse(data['occurrenceDate']) # 截止日期 until = parse(data['recurrenceRules'][0]['recurrenceEnd']) # 获取满足条件日期列表 datelist = list(rrule(DAILY,interval=data['recurrenceRules'][0]['interval'],byweekday=(weekday),dtstart=parse('%s-%s-%s'%(dtstart.year,dtstart.month,dtstart.day)),until=parse('%s-%s-%s'%(until.year,until.month,until.day)))) # 解析data中的startTime,endTime startTime = data['eventInterval']['startTime'].split('T')[1] endTime = data['eventInterval']['endTime'].split('T')[1] # 统一输出格式 for date in datelist: stime = str(date).split(' ')[0] + ' ' + startTime etime = str(date).split(' ')[0] + ' ' + endTime # 格式化输出 laststr = '%s, %s' %(stime,etime) print(laststr)
结果:
2021-09-08 09:00-17:00, 2021-09-08 09:00-17:00 2021-09-10 09:00-17:00, 2021-09-10 09:00-17:00 2021-09-13 09:00-17:00, 2021-09-13 09:00-17:00 2021-09-15 09:00-17:00, 2021-09-15 09:00-17:00 2021-09-17 09:00-17:00, 2021-09-17 09:00-17:00 2021-09-20 09:00-17:00, 2021-09-20 09:00-17:00 2021-09-22 09:00-17:00, 2021-09-22 09:00-17:00 2021-09-24 09:00-17:00, 2021-09-24 09:00-17:00 2021-09-27 09:00-17:00, 2021-09-27 09:00-17:00 2021-09-29 09:00-17:00, 2021-09-29 09:00-17:00
各参数均可根据需要调整。
END
以上就是本期为大家整理的全部内容了,赶快练习起来吧,喜欢的朋友可以点赞、点在看也可以分享到朋友圈让更多人知道哦
往期推荐
Python送你王者荣耀官网全套皮肤!!!