如何在 python 中获取过去四个月的第一个和最后一个日期
how to get first and last dates of past four months in python
我正在尝试获取过去四个月的第一个和最后一个日期。我尝试了以下概念,
@staticmethod
def getDateRangeByMonth(year, month):
"""
:param year:
:param month:
:return:
"""
if year is None:
today = datetime.today()
year = today.year
if month is None:
today = datetime.today()
month = today.month
_, num_days = calendar.monthrange(year, month)
since = datetime.datetime.strptime(str(datetime.date(year, month,
1)), "%Y-%m-%d")
till = datetime.datetime.strptime(str(datetime.date(year, month,
num_days)), "%Y-%m-%d")
return since, till
for i in range(0,4):
today = datetime.today()
since, till = getDateRangeByMonth(today.year, today.month - i)
我知道当过去的月份穿过前一年时,这个概念就会下降,比如如果月份是 1 月或 2 月,那么年份就必须改变。
如何改变这个或者我这样做有什么问题
提前致谢
这是一个修改后的函数,它为您提供所需数量的前几个月的开始日期和结束日期:
def getPrevDateRangeByMonth(year, month, prev):
if year is None:
today = datetime.date.today()
year = today.year
if month is None:
today = datetime.date.today()
month = today.month
since = []
till = []
for i in range(prev):
if month == 0:
year -= 1
month = 12
_, num_days = calendar.monthrange(year, month)
since.append(datetime.datetime.strptime(str(datetime.date(year, month, 1)), "%Y-%m-%d"))
till.append(datetime.datetime.strptime(str(datetime.date(year, month, num_days)), "%Y-%m-%d"))
month -= 1
return since, till
prev = 4
today = datetime.date.today()
since, till = getPrevDateRangeByMonth(2017, 3, prev)
for i in range(prev):
print(since[i], till[i])
我已将 datetime.today()
更改为 datetime.date.today()
,因为这对我来说就是这样,你可能应该改回来。
在下面的代码中,诀窍是 datetime 模块提供 timedelta
提前一天和 date.replace
获取月份的第一天。所以这是一个简单的函数:
def start_end_by_month(dat, delta):
d = dat.replace(day = 1)
till = []
since = []
for i in range(delta):
d = d - datetime.timedelta(days=1)
till.append(d)
d = d.replace(day=1)
since.append(d)
return since, till
用法示例:
>>> start_end_by_month(datetime.date(2008, 3, 10), 5)
([datetime.date(2008, 2, 1), datetime.date(2008, 1, 1), datetime.date(2007, 12, 1),
datetime.date(2007, 11, 1), datetime.date(2007, 10, 1)],
[datetime.date(2008, 2, 29), datetime.date(2008, 1, 31), datetime.date(2007, 12, 31),
datetime.date(2007, 11, 30), datetime.date(2007, 10, 31)])
表明这很容易跳过一年的界限...
我正在尝试获取过去四个月的第一个和最后一个日期。我尝试了以下概念,
@staticmethod
def getDateRangeByMonth(year, month):
"""
:param year:
:param month:
:return:
"""
if year is None:
today = datetime.today()
year = today.year
if month is None:
today = datetime.today()
month = today.month
_, num_days = calendar.monthrange(year, month)
since = datetime.datetime.strptime(str(datetime.date(year, month,
1)), "%Y-%m-%d")
till = datetime.datetime.strptime(str(datetime.date(year, month,
num_days)), "%Y-%m-%d")
return since, till
for i in range(0,4):
today = datetime.today()
since, till = getDateRangeByMonth(today.year, today.month - i)
我知道当过去的月份穿过前一年时,这个概念就会下降,比如如果月份是 1 月或 2 月,那么年份就必须改变。
如何改变这个或者我这样做有什么问题
提前致谢
这是一个修改后的函数,它为您提供所需数量的前几个月的开始日期和结束日期:
def getPrevDateRangeByMonth(year, month, prev):
if year is None:
today = datetime.date.today()
year = today.year
if month is None:
today = datetime.date.today()
month = today.month
since = []
till = []
for i in range(prev):
if month == 0:
year -= 1
month = 12
_, num_days = calendar.monthrange(year, month)
since.append(datetime.datetime.strptime(str(datetime.date(year, month, 1)), "%Y-%m-%d"))
till.append(datetime.datetime.strptime(str(datetime.date(year, month, num_days)), "%Y-%m-%d"))
month -= 1
return since, till
prev = 4
today = datetime.date.today()
since, till = getPrevDateRangeByMonth(2017, 3, prev)
for i in range(prev):
print(since[i], till[i])
我已将 datetime.today()
更改为 datetime.date.today()
,因为这对我来说就是这样,你可能应该改回来。
在下面的代码中,诀窍是 datetime 模块提供 timedelta
提前一天和 date.replace
获取月份的第一天。所以这是一个简单的函数:
def start_end_by_month(dat, delta):
d = dat.replace(day = 1)
till = []
since = []
for i in range(delta):
d = d - datetime.timedelta(days=1)
till.append(d)
d = d.replace(day=1)
since.append(d)
return since, till
用法示例:
>>> start_end_by_month(datetime.date(2008, 3, 10), 5)
([datetime.date(2008, 2, 1), datetime.date(2008, 1, 1), datetime.date(2007, 12, 1),
datetime.date(2007, 11, 1), datetime.date(2007, 10, 1)],
[datetime.date(2008, 2, 29), datetime.date(2008, 1, 31), datetime.date(2007, 12, 31),
datetime.date(2007, 11, 30), datetime.date(2007, 10, 31)])
表明这很容易跳过一年的界限...