Python時間處理-dateutil模塊

dateutil模塊主要有兩個函數(shù),parser和rrule。

其中parser是根據(jù)字符串解析成datetime,而rrule則是根據(jù)定義的規(guī)則來生成datetime。

安裝

直接用easy_install或pip在線安裝

easy_install python-dateutil
pip install python-dateutil

1、 parser

parser是根據(jù)字符串解析成datetime,字符串可以很隨意,可以用時間日期的英文單詞,可以用橫線、逗號、空格等做分隔符。
沒指定時間默認是0點,沒指定日期默認是今天,沒指定年份默認是今年。

>>> from dateutil.parser import parse

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

>>> 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)

只有月日時,parser會將分隔符前面的數(shù)字解析為月份,后面的為日
當有年份時,在前面的月份超出范圍時,會自動判斷哪個是月哪個是日

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

生成一個連續(xù)的日期列表
>>> 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對象間相差的年月日等時間數(shù)量

兩個日期相差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月,當日期不滿整月時,差的月數(shù)按n-m算,當日期滿整月后,差的月數(shù)按n-m+1算。
差的年數(shù)同月數(shù)的情況一樣。
例子如下:

>>> 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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容