Python DATEUTIL 时间库

Python DATEUTIL 时间库,第1张

Python DATEUTIL 时间库 Dateutil relativedelta
import dateutil
import datetime
import calendar
from dateutil import relativedelta # dateutil下进入报错, 直接从relativedelta进入引用方法

now = datetime.datetime.now()
today = datetime.date.today()
print(now,today,sep='n') 
# 2021-12-28 08:33:09.955389
# 2021-12-28

# next day 
x = now + relativedelta.relativedelta(days=1)
print(x)
# 2021-12-29 08:33:09.955389
# months=1 -> next month

# Next month, plus one week.
x = now + relativedelta.relativedelta(months=1,weeks=1)
print(x)
# 2022-02-04 08:33:09.955389

# Next month, plus one week, at 10am.
x = now + relativedelta.relativedelta(months=1,weeks=1,hour=10)
print(x)
# 2022-02-04 10:33:09.955389

# 指定year = 1
x = now + relativedelta.relativedelta(year=1)
print(x)
# 0001-12-28 08:33:09.955389
  • 参数复数 代表 间隔
  • 参数单数 代表 时间改为某个特定时间
# 计算两个datetime类型的时间间隔
y = relativedelta.relativedelta(dt1=datetime.datetime(2020, 1, 1, 10, 0), dt2=today)
print(y) 
# relativedelta(years=-1, months=-11, days=-26, hours=-14)
# 因为返回的是元祖, 可以通过y.years获得年份间隔
print(y.years) 
# -18

# One month before one year.
y = now + relativedelta.relativedelta(years=1,months=-1)
print(y)
# 2022-11-28 08:43:43.310939
# 月维度上的加减不会跳出该月底
y = datetime.datetime(2020,1,31) + relativedelta.relativedelta(months=1)
print(y) 
# 1月底+1月 不会跳出2月
# 2020-02-29 00:00:00
# Next friday
y = today + relativedelta.relativedelta(weekday=relativedelta.FR)
print(y)
# 下一个周五

# Last friday in this month.
# 指定本月31号, 往前推一个FR
y = today + relativedelta.relativedelta(day=31,weekday=relativedelta.FR(-1))
print(y)

# Next wednesday (it’s today!).包含今天是周三
y = today + relativedelta.relativedelta(weekday=relativedelta.WE(+1))
print(y)

# 下个周三, 不包括今天
y = today + relativedelta.relativedelta(days=1,weekday=relativedelta.WE(+1))
print(y)

# 2020-1-1后10天
y = datetime.date(2020,1,20) + relativedelta.relativedelta(yearday=10)
print(y) 
# 2020-01-10, 以某年第一天计算
y = datetime.date(2020,1,20) + relativedelta.relativedelta(days=20,yearday=10)
print(y)
# 2020-01-30 

y = datetime.date(2020,1,10) + relativedelta.relativedelta(days=10)
print(y)
# 2020-01-20 
  • 通过weekday指定周几 weekday=relativedelta.WE(+1)
  • 参数用yearday会从前面datetime的1.1号开始计算, 加入参数day不影响结果, 加入days会累加天数
rrule
import datetime
from dateutil import rrule 
from pprint import pprint

# 以dtstart开始, 取10次, daily取
a = list(rrule.rrule(rrule.DAILY,count=10,dtstart=datetime.date(2020,1,1)))
pprint(a)
# ...

# Every other day, 5 occurrences.
# 从dtstart开始, 取5次, 间隔是2, daily取
a = list(rrule.rrule(rrule.DAILY,interval=2,count=5,dtstart=datetime.date(2020,1,1)))
pprint(a)
# ...

# 指定start 和 until , 从开始到结束的每一天
y = list(rrule.rrule(rrule.DAILY,dtstart=datetime.date(2021,1,1),until=datetime.date(2021,2,1)))
pprint(y)
# ...

  • 关于 rrule中byweekday的测试
# bymonth -> 指定哪个月
# 需求: 在一段很长的时间间隔(年)中, 获取某个月中的每个周一 / 周二 ...

a = list(rrule.rrule(rrule.YEARLY,bymonth=12,byweekday=0,dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31)))
pprint(a) # 时间间隔内的周一

# byweekday = 0 -> 周一
# byweekday = 1 -> 周二
# byweekday = 2 -> 周三
# byweekday = 3 -> 周四
# byweekday = 4 -> 周五
# byweekday = 5 -> 周六
# byweekday = 6 -> 周七
# byweekday = 7 越界
# 如果要显示所有的日期 -> 用byweekday = range(7)
a = list(rrule.rrule(rrule.YEARLY,bymonth=12,byweekday=range(7),dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31)))
pprint(a)

# same way
# 获取一个长时间中 指定某个月中的每一天
a = list(rrule.rrule(rrule.DAILY,bymonth=12,dtstart=datetime.date(2020,1,1),until=datetime.date(2021,12,31)))
pprint(a)
# Weekly for 10 occurrences.
# 从起始日期开始, 以周的方式取10次
a = list(rrule.rrule(rrule.WEEKLY,count=10,dtstart=datetime.date(2021,1,1)))
pprint(a)

# Every other week, 6 occurrences.
# 从起始日期开始, 以周的方式, 间隔为2 , 取6次
a = list(rrule.rrule(rrule.WEEKLY,interval=2,count=6,dtstart=datetime.date(2021,1,1)))
pprint(a)
# 通过byweekday 指定 周几
a = list(rrule.rrule(rrule.WEEKLY,count=10,byweekday=(rrule.WE,rrule.SU),dtstart=datetime.date(2021,1,1)))
pprint(a)

# Every other week on Tuesday and Thursday, for 8 occurrences.
需要间隔 加入interval

# Monthly on the 1st Friday for ten occurrences.
a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.FR(1)),dtstart=datetime.date(2022,1,1)))
pprint(a)
'''
[datetime.datetime(2022, 1, 7, 0, 0),
 datetime.datetime(2022, 2, 4, 0, 0),
 datetime.datetime(2022, 3, 4, 0, 0),
 datetime.datetime(2022, 4, 1, 0, 0),
 datetime.datetime(2022, 5, 6, 0, 0),
 datetime.datetime(2022, 6, 3, 0, 0),
 datetime.datetime(2022, 7, 1, 0, 0),
 datetime.datetime(2022, 8, 5, 0, 0),
 datetime.datetime(2022, 9, 2, 0, 0),
 datetime.datetime(2022, 10, 7, 0, 0)]
 '''
# FR(1) -> 第一个周五
# FR(2) -> 第二个周五
# FR(-1) -> 最后一个周五

# FR -> 只要是周五
a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.FR),dtstart=datetime.date(2022,1,1)))
''' 
[datetime.datetime(2022, 1, 7, 0, 0),
 datetime.datetime(2022, 1, 14, 0, 0),
 datetime.datetime(2022, 1, 21, 0, 0),
 datetime.datetime(2022, 1, 28, 0, 0),
 datetime.datetime(2022, 2, 4, 0, 0),
 datetime.datetime(2022, 2, 11, 0, 0),
 datetime.datetime(2022, 2, 18, 0, 0),
 datetime.datetime(2022, 2, 25, 0, 0),
 datetime.datetime(2022, 3, 4, 0, 0),
 datetime.datetime(2022, 3, 11, 0, 0)]
 '''
         
# Every other month on the 1st and last Sunday of the month for 10 occurrences.
# 每个月第一个和最后一个周日, 找十个
a = list(rrule.rrule(rrule.MONTHLY,count=10,byweekday=(rrule.SU(1),rrule.SU(-1)),dtstart=datetime.date(2022,1,1)))
pprint(a)
'''
[datetime.datetime(2022, 1, 2, 0, 0),
 datetime.datetime(2022, 1, 30, 0, 0),
 datetime.datetime(2022, 2, 6, 0, 0),
 datetime.datetime(2022, 2, 27, 0, 0),
 datetime.datetime(2022, 3, 6, 0, 0),
 datetime.datetime(2022, 3, 27, 0, 0),
 datetime.datetime(2022, 4, 3, 0, 0),
 datetime.datetime(2022, 4, 24, 0, 0),
 datetime.datetime(2022, 5, 1, 0, 0),
 datetime.datetime(2022, 5, 29, 0, 0)]
 '''

# Monthly on the 2nd and 15th of the month for 5 occurrences.
# 每个月的2号和15号, 找5个
a = list(rrule.rrule(rrule.MONTHLY,count=5,bymonthday=(2,15),dtstart=datetime.date(2020,1,1)))
pprint(a)
'''
[datetime.datetime(2020, 1, 2, 0, 0),
 datetime.datetime(2020, 1, 15, 0, 0),
 datetime.datetime(2020, 2, 2, 0, 0),
 datetime.datetime(2020, 2, 15, 0, 0),
 datetime.datetime(2020, 3, 2, 0, 0)]
 '''
  • byweekday 可以找周几周几
  • bymonthday可以找一月中的几号
# Monthly on the first and last day of the month for 3 occurrences.
a = list(rrule.rrule(rrule.MONTHLY,count=5,bymonthday=(1,-1),dtstart=datetime.date(2020,1,1)))
pprint(a)
'''
[datetime.datetime(2020, 1, 1, 0, 0),
 datetime.datetime(2020, 1, 31, 0, 0),
 datetime.datetime(2020, 2, 1, 0, 0),
 datetime.datetime(2020, 2, 29, 0, 0),
 datetime.datetime(2020, 3, 1, 0, 0)]
'''

# Every 18 months on the 10th thru 15th of the month for 10 occurrences.
a = list(rrule.rrule(rrule.MONTHLY,interval=18,count=10,bymonthday=range(10,16),dtstart=datetime.date(2021,1,1)))
pprint(a)
'''
[datetime.datetime(2021, 1, 10, 0, 0),
 datetime.datetime(2021, 1, 11, 0, 0),
 datetime.datetime(2021, 1, 12, 0, 0),
 datetime.datetime(2021, 1, 13, 0, 0),
 datetime.datetime(2021, 1, 14, 0, 0),
 datetime.datetime(2021, 1, 15, 0, 0),
 datetime.datetime(2022, 7, 10, 0, 0),
 datetime.datetime(2022, 7, 11, 0, 0),
 datetime.datetime(2022, 7, 12, 0, 0),
 datetime.datetime(2022, 7, 13, 0, 0)]
'''

# Every Tuesday, every other month, 6 occurrences.
a = list(rrule.rrule(rrule.MONTHLY,interval=2,count=6,byweekday=rrule.TU,dtstart=datetime.date(2021,1,1)))
pprint(a)
'''
[datetime.datetime(2021, 1, 5, 0, 0),
 datetime.datetime(2021, 1, 12, 0, 0),
 datetime.datetime(2021, 1, 19, 0, 0),
 datetime.datetime(2021, 1, 26, 0, 0),
 datetime.datetime(2021, 3, 2, 0, 0),
 datetime.datetime(2021, 3, 9, 0, 0)]
'''

# Yearly in June and July for 4 occurrences.
a = list(rrule.rrule(rrule.YEARLY,count=4,bymonth=(6,7),dtstart=datetime.date(2021,1,1)))
pprint(a)
'''
[datetime.datetime(2021, 6, 1, 0, 0),
 datetime.datetime(2021, 7, 1, 0, 0),
 datetime.datetime(2022, 6, 1, 0, 0),
 datetime.datetime(2022, 7, 1, 0, 0)]
'''

# Every 3rd year on the 1st, 100th and 200th day for 4 occurrences.
a = list(rrule.rrule(rrule.YEARLY,count=4,interval=3,byyearday=(1,100,200),dtstart=datetime.date(2021,1,1)))
pprint(a)
'''
[datetime.datetime(2021, 1, 1, 0, 0),
 datetime.datetime(2021, 4, 10, 0, 0),
 datetime.datetime(2021, 7, 19, 0, 0),
 datetime.datetime(2024, 1, 1, 0, 0)]
'''

# Every 20th Monday of the year, 3 occurrences.
a = list(rrule.rrule(rrule.YEARLY,count=3,byweekday=rrule.MO(20),dtstart=datetime.date(2021,1,1)))
pprint(a)
'''
[datetime.datetime(2021, 5, 17, 0, 0),
 datetime.datetime(2022, 5, 16, 0, 0),
 datetime.datetime(2023, 5, 15, 0, 0)]
'''

# Monday of week number 20 (where the default start of the week is Monday), 3 occurrences.
# 第二十周的周一
 list(rrule(YEARLY, count=3, byweekno=20, byweekday=MO, dtstart=datetime.date(2021,1,1)))

​ 对于rrule中参数的图解

如果需要第10个周一 -> 指定MO(10)就好了

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5689559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存