zoukankan      html  css  js  c++  java
  • ✍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))  # <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
    

    image-20210728152044792

  • 相关阅读:
    [LeetCode] Best Time to Buy and Sell Stock III
    [LeetCode] Implement strStr()
    [LeetCode] Wildcard Matching
    [LeetCode] Gray Code
    [LeetCode] Divide Two Integers
    [LeetCode] Flatten Binary Tree to Linked List
    [LeetCode] Binary Tree Maximum Path Sum
    [TopCoder][SRM] SRM 562 DIV 2
    推荐博客文章
    检测两点所确定直线上的像素坐标
  • 原文地址:https://www.cnblogs.com/songhaixing/p/15604859.html
Copyright © 2011-2022 走看看