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

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

本期导读

本期给大家介绍一个日期处理库 -- dateutil。该库是 datetime 模块的扩展和加强,具有更完善的时间处理机制,支持模糊匹配,在实际应用过程中比较常用的是 dateutil 的 parser 和 rrule 两个模块,parser 是根据字符串解析成 datetimerrule 是根据定义的规则来生成 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 列表经典使用技巧

Python送你王者荣耀官网全套皮肤!!!

收藏|Unsplash高清壁纸批量下载(源码+工具)!!!

Python 告诉你《你好,李焕英》为什么能超越《唐探3》!!!

相关文章
|
1月前
|
缓存 调度 开发者
Python 时间处理
【2月更文挑战第6天】 Python 时间处理
38 1
|
8月前
|
Linux 数据安全/隐私保护 C++
如何使用Cython对python脚本加密成pyd/so
如何使用Cython对python脚本加密成pyd/so
175 0
如何使用Cython对python脚本加密成pyd/so
python datetime 时间处理
python datetime 时间处理
python time时间处理详解
python time时间处理详解
python time时间处理详解
|
存储 Python
Easy Games With Python and Pygame(三)- Pygame Event
Easy Games With Python and Pygame(三)- Pygame Event
Easy Games With Python and Pygame(三)- Pygame Event
Easy Games With Python and Pygame(二)- Pygame 绘制图形
Easy Games With Python and Pygame(二)- Pygame 绘制图形
Easy Games With Python and Pygame(二)- Pygame 绘制图形
|
IDE 开发工具 Python
Easy Games With Python and Pygame(一)- Pygame Quickstart
Easy Games With Python and Pygame(一)- Pygame Quickstart
Easy Games With Python and Pygame(一)- Pygame Quickstart
|
数据可视化 前端开发 程序员
手把手教你使用 Python 实现一键抠图, 照片换背景|so easy!
大家好我是迷彩.平时我们工作或者生活中(比如应聘的简历)可能会用到蓝底,红底,白底各种相片,可能当时我们只有一种背景颜色的相片,但是我们又没有时间去拍一张,关键还需要白花花的银子,再加上抠图还是个技术活,对于ps功底薄弱的我来时,留下没有技术的眼泪,但是没有什么难道作为程序员我们,今天带大家使用Python一步步实现一键抠图,使用代码一键抠图,一劳永逸!好了,废话少说我们直接上步骤:
519 0
|
Java Python
轻松搞定python装饰器,so easy
学习Java的都知道Java 中有面向切面的编程,也就是aop,说白了就是在你原来的代码执行前做一些操作,这样的好处就是不修改原来的代码逻辑,增强程序的功能,很方便。人生苦短,我用python,python中也有同样的功能,而且更方便,这个功能就是装饰器
72 0
|
2天前
|
Shell Python
GitHub星标破千Star!Python游戏编程的初学者指南
Python 是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种,与其说是教编程的书,倒不如说是在教“游戏制作软件”,或教授使用一种呆板的语言,使得编程“简单”到不再是编程。而第二种,它们就像是教数学课一样教编程:所有的原理和概念都以小的应用程序的方式呈现给读者。