文章目录

  • 0.背景故事
  • 1.relativedelta的使用基础
  • (1)某日的后一天 & 前一天
  • (2)某日的未来一周、近一周
  • 2.最近一周、最近二周、最近一月、最近一年
  • 3.最近一自然周、最近两自然周
  • (1)计算当前日期是一周的第几天
  • (2)计算最近一自然周
  • (3)计算最近二自然周
  • 4.最近一自然月、最近两自然月, 最近一自然年
  • (1)根据datetime中replace的使用
  • (2)最近一自然月、最近二自然月


0.背景故事

本篇博文主要内容有:

  • 计算近一周、近两周、近一个月、近一年等周期
  • 计算最近一自然周、最近二自然周、最近一自然月、最近一自然年等周期

dateutil python dateutil python3_datetime

最近一周:最近过去七天这个周期,包含当前日期共计7天。例如,当前日期如果是3.25,则近一周从3.19号开始算起。



最近一自然周:从当前日期所在周中的星期一开始,例如当前日如果是3.25,则近一自然周是从3.21开始算起。



最近一月:是从当前日期减去一个月的时间,算做开始日期



最近一自然月:是当前日期所在的月份的第一天开始算起,知道当前日



最近一年:是从当前日期减去一年的时间,算做开始日期



最近一自然年: 当前日期所在年份的第一天开始算起,即阳历的1月1日。




1.relativedelta的使用基础

# relativedelta类代表着一种相对增量,
# 可以传递年、月、日等信息,代表相对日期往前推进或往后推迟几天

class relativedelta(object):

    def __init__(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):




(1)某日的后一天 & 前一天

from datetime import datetime as dt, timedelta
from dateutil.relativedelta import relativedelta




someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

gap_date = relativedelta(days=1)
print(type(gap_date))

tomorrow_date = (someday + gap_date).strftime("%Y%m%d")
print("tomorrow_date----->", tomorrow_date)

yesterday_date = (someday - gap_date).strftime("%Y%m%d")
print("yesterday_date----->", yesterday_date)


# 结果
<class 'dateutil.relativedelta.relativedelta'>

tomorrow_date-----> 20220326		# 某日第二天

yesterday_date-----> 20220324		# 某日前一天




(2)某日的未来一周、近一周

from datetime import datetime as dt
from dateutil.relativedelta import relativedelta



someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")
gap_date = relativedelta(weeks=1)

next_week = (someday + gap_date).strftime("%Y%m%d")
print("next_week----->", next_week)

last_week = (someday - gap_date).strftime("%Y%m%d")
print("last_week----->", last_week)


# 结果

next_week-----> 20220401

last_week-----> 20220318




2.最近一周、最近二周、最近一月、最近一年

from datetime import datetime as dt
from dateutil.relativedelta import relativedelta



someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

# 最近一周
last1w = (someday - relativedelta(weeks=1)).strftime('%Y%m%d')
print(last1w)

# 最近二周
last2w = (someday - relativedelta(weeks=2)).strftime('%Y%m%d')
print(last2w)

# 最近一月
last1m = (someday - relativedelta(months=1)).strftime('%Y%m%d')
print(last1m)

# 最近一年
last1y = (someday - relativedelta(years=1)).strftime('%Y%m%d')
print(last1y)


# 结果

20220318
20220311
20220225
20210325




3.最近一自然周、最近两自然周

dateutil python dateutil python3_datetime_02

  • 3.25日是星期五,近一自然周是从3.21开始的日期,中间相差4天
  • 3.24日是星期四,近一自然周也是3.21开始的日期,中间相差3天
  • 如果我们能知道某日是星期几,然后减去一,就是间隔的日期了




(1)计算当前日期是一周的第几天

from datetime import datetime as dt, timedelta


someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")
week_num = someday.isoweekday()
print(week_num)

# 结果

5		# 代表本周的第五天,星期五的意思

同理,如果输入3.24日,结果就是4,代表星期四或本周第四天的意思。




(2)计算最近一自然周

from datetime import datetime as dt
from dateutil.relativedelta import relativedelta



someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")


# 最近一自然周
natural_last1w = (someday - relativedelta(days=someday.isoweekday() - 1)).strftime('%Y%m%d')
print(natural_last1w)

# 结果
20220321




(3)计算最近二自然周

from datetime import datetime as dt, timedelta
from dateutil.relativedelta import relativedelta



# 这个实现近一自然周的相对增量
relativedelta(days=someday.isoweekday() - 1)

#近二个自然周,如上日期增加7天即可
relativedelta(days=someday.isoweekday() + 6)

someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

# 最近二自然周
natural_last2w = (someday - relativedelta(days=someday.isoweekday() + 6)).strftime('%Y%m%d')
print(natural_last2w)

# 结果:
20220314




4.最近一自然月、最近两自然月, 最近一自然年



(1)根据datetime中replace的使用

replace函数可以修改,某个datetime对象年、月、日的数值大小



from datetime import datetime as dt


someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

re_day = someday.replace(day=1).strftime("%Y%m%d")
print(re_day)

re_month = someday.replace(month=1).strftime("%Y%m%d")
print(re_month)

re_august = someday.replace(month=8).strftime("%Y%m%d")
print(re_august)


# 结果

20220301
20220125
20220825



(2)最近一自然月、最近二自然月

from datetime import datetime as dt

someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

# 只需要日期,day对应的值改为1,即为当前月的第一天
natural_last1m = someday.replace(day=1).strftime('%Y%m%d')
print(natural_last1m)

# 结果
20220301



from datetime import datetime as dt
from dateutil.relativedelta import relativedelta

someday = "20220325"
someday = dt.strptime(str(someday), "%Y%m%d")

natural_last2m = (someday.replace(day=1) - relativedelta(months=1)).strftime("%Y%m%d")
print(natural_last2m)


# 结果
20220201