文章目录
0.背景故事
本篇博文主要内容有:
- 计算近一周、近两周、近一个月、近一年等周期
- 计算最近一自然周、最近二自然周、最近一自然月、最近一自然年等周期
最近一周:最近过去七天这个周期,包含当前日期共计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.最近一自然周、最近两自然周
- 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