天天看點

python時間處理子產品dateutil

原文連結:https://www.jianshu.com/p/f29dddce3a9a

dateutil子產品主要有兩個函數,parser和rrule。

其中parser是根據字元串解析成datetime,而rrule則是根據定義的規則來生成datetime。

安裝

直接用easy_install或pip線上安裝

easy_install python-dateutil
pip install python-dateutil           

複制

1、 parser

parser是根據字元串解析成datetime,字元串可以很随意,可以用時間日期的英文單詞,可以用橫線、逗号、空格等做分隔符。

沒指定時間預設是0點,沒指定日期預設是今天,沒指定年份預設是今年。

>>> from dateutil.parser import parse

>>> parse("2018-10-21")
datetime.datetime(2018, 10, 21, 0, 0)

>>> parse('16:59:59')  # 預設日期為系統日期 
datetime.datetime(2018, 11, 1, 16, 59, 59)

>>> parse("20181021")
datetime.datetime(2018, 10, 21, 0, 0)

>>> parse("2018/10/21")
datetime.datetime(2018, 10, 21, 0, 0)

>>> parse("10-21")
datetime.datetime(2018, 10, 21, 0, 0)

>>> parse("10/21")
datetime.datetime(2018, 10, 21, 0, 0)

# fuzzy開啟模糊比對,過濾掉無法識别的時間日期字元
>>> parse("this is the wonderful moment 16:59:59,I feel good",fuzzy=True)
datetime.datetime(2018, 11, 1, 16, 59, 59)           

複制

隻有月日時,parser會将分隔符前面的數字解析為月份,後面的為日

當有年份時,在前面的月份超出範圍時,會自動判斷哪個是月哪個是日

>>> parse("3/8")
datetime.datetime(2018, 3, 8, 0, 0)

>>> parse("8/3")
datetime.datetime(2018, 8, 3, 0, 0)

>>> parse("3-8")
datetime.datetime(2018, 3, 8, 0, 0)

>>> parse("8-3")
datetime.datetime(2018, 8, 3, 0, 0)

>>> parse("21/10")
ValueError: month must be in 1..12

>>> parse("3/8/2018")
datetime.datetime(2018, 3, 8, 0, 0)

>>> parse("8/3/2018")
datetime.datetime(2018, 8, 3, 0, 0)

>>> parse("2018/3/8")
datetime.datetime(2018, 3, 8, 0, 0)

>>> parse("3/15/2018")
datetime.datetime(2018, 3, 15, 0, 0)

目前面的月份超過12時,parser會自動識别月和日
>>> parse("15/3/2018")
datetime.datetime(2018, 3, 15, 0, 0)

分隔符改成"-"也一樣
>>> parse("15-3-2018")
datetime.datetime(2018, 3, 15, 0, 0)

但是當年份放在前面時,隻能按年-月-日的順序
>>> parse("2018/15/3")
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)           

複制

2、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,until:是開始和結束時間
  • wkst:周開始時間
  • interval:間隔
  • count:指定生成多少個
  • byxxx:指定比對的周期。比如byweekday=(MO,TU)則隻有周一周二的比對。byweekday可以指定MO,TU,WE,TH,FR,SA,SU。即周一到周日。
>>> 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)]           

複制

計算時間差

rrule可計算出兩個datetime對象間相差的年月日等時間數量

兩個日期相差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           

複制

兩個日期相差幾個月

前一個月為m月,後一個月為n月,當日期不滿整月時,差的月數按n-m算,當日期滿整月後,差的月數按n-m+1算。

差的年數同月數的情況一樣。

例子如下:

>>> rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-11-10')).count()
8
>>> rrule.rrule(rrule.MONTHLY,dtstart=parse('2018-3-15'),until=parse('2018-11-20')).count()
9

>>> rrule.rrule(rrule.YEARLY,dtstart=parse('2016-3-15'),until=parse('2018-2-10')).count()
2
>>> rrule.rrule(rrule.YEARLY,dtstart=parse('2016-3-15'),until=parse('2018-3-15')).count()
3           

複制

來源:https://www.jianshu.com/p/f29dddce3a9a

官方文檔 : http://labix.org/python-dateutil

pypi:https://pypi.org/project/python-dateutil/