技巧 | 有了这个Python神器,时间处理【so easy】

大家好,我是欧K。

本期给大家介绍一个日期处理库 – 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: 布尔值,指定启用或禁用结果缓存。

3.1 实例一

起始时间: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)]

3.2 实例二

根据 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

各参数均可根据需要调整。


以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享让更多人知道哦

4. 推荐阅读

基础 | Python函数一文详解
技巧 | 20个Pycharm最实用最高效的快捷键(动态展示)
技巧 | 5000字超全解析Python三种格式化输出方式【% / format / f-string】
爬虫 | Python送你王者荣耀官网全套皮肤
爬虫 | 用python构建自己的IP代理池,再也不担心IP不够用啦!
可视化 | Python制作最炫3D可视化地图
可视化 | 动起来的中国大学排名,看看你的母校在哪里

微信公众号 “Python当打之年” ,每天都有python编程技巧推送,希望大家可以喜欢在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python当打之年

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值