一本正经胡说八道的猫
因为数据处理需要,有这个需求。
用两种方法,涉及“datetime.timedelta”和“dateutil.relativedelta.relativedelta”的操作。
查看了区别:
Definition: datetime.timedelta([days[, seconds[, microseconds[,
milliseconds[, minutes[, hours[, weeks]]]]]]])
Definition: relativedelta.relativedelta(self, dt1=None, dt2=None,
years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0,
seconds=0, microseconds=0, year=None, month=None, day=None,
weekday=None, yearday=None, nlyearday=None, hour=None, minute=None,
second=None, microsecond=None)
方法一:
用datetime.weekday加 datetime.timedelta
先用for循环算出月头哪天为周五,然后在该日期基础上加两周得到日期
import datetime
def pay_day(y, m, weekday):
for d in range(1, 8):
if datetime.date(int(y), int(m), d).weekday() == weekday:
date = datetime.date(int(y), int(m), d)
return date + datetime.timedelta(weeks=2)
#return date + datetime.timedelta(days=14)加14天也可以
显示结果:
[In]
for i in range(1,13):
print(pay_day(2022,i,4))
[Out]
2022-01-21
2022-02-18
2022-03-18
2022-04-15
2022-05-20
2022-06-17
2022-07-15
2022-08-19
2022-09-16
2022-10-21
2022-11-18
2022-12-16
方法二:
用dateutil.relativedelta.relativedelta
def pay_days(y, m, x):
return datetime.date(y,m, 1)+relativedelta.relativedelta(day = 0, weekday = relativedelta.FR(x))
[In]
for i in range(1,13):
print(pay_days(2022,i,3))
[Out]
2022-01-21
2022-02-18
2022-03-18
2022-04-15
2022-05-20
2022-06-17
2022-07-15
2022-08-19
2022-09-16
2022-10-21
2022-11-18
2022-12-16
两种方法都能快速算出,用时都是6ms。
不过方法二的代码更加简洁,我更喜欢用。
网友评论