用Python查找每月的最后一天
要记住每个月的最后一天,并对其加以确定,这可能是一个挑战。你有没有想过,应该有一个计算机程序,只需几行代码就能向你显示任何一年中任何月份的最后一天?
这篇文章将教我们如何创建Python程序,让我们使用标准的Python库轻松找到每月的最后一天。我们将使用内置库,如calendar
和datetime
,以及一些第三方库,如pandas
和arrow
,在Python中查找每月的最后一天。
使用Python中的日历库查找本月的最后一天
在这一节中,我们将使用内置的Python库calendar
来查找本月的最后一天。
这个程序使用calendar
子函数monthrange
,它接收了两个参数,year
和month
,并返回一个键对值(week_day_of_first_day, number_of_days)
。
第一个值表示该月的第一个工作日(0是周一,6是周日),而第二个值显示该月的最后一天。
import calendar
last_day = calendar.monthrange(2000, 1)
print(last_day)
一月有31天,在2000年,第一天是在星期六。
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
(5, 31)
Process finished with exit code 0
让我们通过给一些闰年作为输入来检查程序,看它是否能正确地找到Python中的最后一天。
import calendar
last_day1 = calendar.monthrange(2000, 2)
print(last_day1)
last_day2 = calendar.monthrange(2004, 2)
print(last_day2)
闰年将被相应地显示出来。
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
(1, 29)
(6, 29)
Process finished with exit code 0
使用Python中的DateTime模块查找本月的最后一天
datetime
库也是一个内置的库,用于在Python中查找本月的最后一天。
从每个月的第一天中减去一天来查找本月的最后一天
这个程序在提供月份和年份作为输入的情况下,找到一个月的最后一天。
import datetime
year = 2001
month = 2
v = datetime.date(year + int(month / 12), (month % 12) + 1, 1) - datetime.timedelta(days=1)
print(v)
让我们来分解一下代码:
第一行是导入datetime
库。创建了两个变量,year
和month
,接受年和月的输入。子函数datetime.date()
,在参数内取三个值作为日期。
这个程序使用的逻辑是,从一个月的第一天往回走一天,我们就可以看到前一个月的最后一天。这样我们就得到了所有月份的最后一天,只有12月除外,因为12月是前一年的最后一天。
程序为12月的年份添加了一个1
,以解决使用行的这个问题:
datetime.date(year + int(month / 12)
同样,对于月份,如果是12月,程序会在month % 12
的模子上加上一个1
。
这样就把月份设置为1
,它的天数与12
相同,而不改变当前的年份。最后,使用datetime.timedelta(days=1)
函数从当前日期中减去一天。
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2001-02-28
Process finished with exit code 0
使用datetime
库的另一种方法是创建一个方法并从中返回两个值,一个用于12月,另一个用于其余月份。让我们看看下面的程序。
import datetime
def last_day_of_month(date):
if date.month == 12:
return date.replace(day=31)
return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)
print(last_day_of_month(datetime.date(2022, 10, 25)))
创建了一个方法last_day_of_month
,参数是date
。在if
语句中,使用date.month == 12
,检查月份是否为12月。
如果条件为真,则用date.replace(day=31)
替换日期。否则,date
被替换为第一天,并通过递增month=date.month + 1
替换为下个月,然后从中减去一天,使日期变成给定月份的最后一天。
下面给出一个例子:
return date.replace(month=date.month + 1, day=1) - datetime.timedelta(days=1)
最后,通过传递一个日期datetime.date()
,调用该方法,然后打印出来。它提供了一个比前面的例子更直接的解决方案。
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2022-10-31
Process finished with exit code 0
使用存储在数组中的预载日期,使用for
循环来寻找本月的最后一天
另一个使用datetime
库的例子是创建一个每月最后一天的数组,在一个循环中运行,并让datetime
库过滤掉无效的日期。
请看下面的示例代码。
from datetime import datetime
def find_last_day(year, month):
end_days = [31, 30, 29, 28, 27]
for i in end_days:
try:
date = datetime(year, month, i)
except ValueError:
continue
else:
return date.date()
return None
print(find_last_day(2020, 2))
该程序使用一个有两个参数的方法find_last_day()
,year
和month
。在一个数组end_days
中,存储了可能的最后几天的数据。
创建了一个for
循环,为end_days
中的元素数量运行。在一个try
块内,一个变量使用datetime()
子函数存储日期。
月和年的值是按照参数设置的,在日值中,i
被存储。
在except
区块内,给出了ValueError
的条件,在变量date
中,如果月份值无效,则丢弃i
的值。然后使用continue
重新运行该循环。
如果找到一个有效的值,该方法会返回else
块内的date
。最后,使用return None
,以便该方法不返回任何其他值。
该程序从给定的数组中搜索day
的适当值。对于12月,循环找到31并返回该值;对于11月这样的月份,只有30是可能的,所以它返回该日。
同样地,2月31日和30日也不可能,所以循环会在它们上面运行。如果给定的年份是闰年,那么循环会返回29;否则,会返回28。
最后,通过传递二月和2020年的年份来调用该方法。
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2020-02-29
Process finished with exit code 0
我们可以看到,2020年2月是一个闰年。
打印一个日历年所有月份的最后一天以查找该月的最后一天
库datetime
,也可以用来在Python中找到一个日历年中所有月份的最后一天,并将它们全部打印出来。让我们来看看这个程序。
import datetime
def month_end(date):
next_month = date.replace(day=28) + datetime.timedelta(days=4)
return next_month - datetime.timedelta(days=next_month.day)
for month in range(1, 13):
print(month_end(datetime.date(2022, month, 1)))
我们来分解一下代码:
创建了一个方法month_end
,它接受一个参数date
。在这个方法中,一个变量next_month
,它接收date
,并使用28
,因为每个月最少有28天,所以用date.replace(day=28)
,替换掉这一天。
在值被替换后,4天被添加到这个值中,以便将date
移到下个月的第一天或第二天,这取决于前一个月的天数。
假设当前日期是2000, 3, 4
,这个月的日值是4
。用这个日值减去date
,就可以得到上个月的最后一天–2000, 2, 28
;这个逻辑在本程序中使用。
变量next_month
中的日值被自己减去,并使用语法从该方法中返回:
return next_month - datetime.timedelta(days=next_month.day)
我们创建了一个for
循环,使用实例month
,在(1,13)
的范围内运行一个循环。在循环内,通过传递datetime.date
,调用方法month_end
,向该方法提供年和日。
月份由for
循环中使用的实例month
来代替,以传递12个月给该方法。
for month in range(1, 13):
print(month_end(datetime.date(2022, month, 1)))
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2022-01-31
2022-02-28
2022-03-31
2022-04-30
2022-05-31
2022-06-30
2022-07-31
2022-08-31
2022-09-30
2022-10-31
2022-11-30
2022-12-31
Process finished with exit code 0
输出中显示的是一个日历年的所有最后一天。
使用Arrow库查找每月的最后一天
这是一个第三方的Python库,可用于日期操作。它将被用来在Python中查找本月的最后一天。
该程序使用Arrow的子函数utcnow()
,以获得当前的世界时间。它使用ceil('month').date
找到该月的上限。
import arrow
print(arrow.utcnow().ceil('month').date())
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2022-10-31
Process finished with exit code 0
该代码给出了当前月份的最后一天。
使用Pandas模块查找本月的最后一天
本节使用一个第三方Python库,Pandas,来查找本月的最后一天。这里,程序导入了两个库包 –datetime
和pandas
。
创建了一个方法check_month_end
,该方法接收了一个参数date
。这个方法接收参数date
,并使用date + pd.offsets.MonthEnd(0)
添加该月的剩余天数。
下面是示例代码:
from datetime import datetime
import pandas as pd
def check_month_end(date):
return date + pd.offsets.MonthEnd(0)
print(check_month_end(datetime(2005, 2, 6)))
print(check_month_end(datetime(2004, 2, 29)))
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
2005-02-28 00:00:00
2004-02-29 00:00:00
Process finished with exit code 0
输出是Pandas的时间戳格式,显示该月的最后一天。
使用Pandas检查某天是否是本月的最后一天
Pandas可以用来检查一个给定的日期是否是这个月的最后一天。与之前的几个程序不同,这个程序接受用户输入,并检查给定的日期是否有效。
该程序使用参数值来检查它是否与月底相匹配,使用date + pd.offsets.MonthEnd(0) == date
。该方法在被调用时返回布尔值。
见所提供的示例代码。
from datetime import datetime
import pandas as pd
def check_month_end(date):
return date + pd.offsets.MonthEnd(0) == date
print(check_month_end(datetime(1996, 5, 16)))
print(check_month_end(datetime(1996, 5, 31)))
输出:
"C:UsersWin 10venvScriptspython.exe" "C:/Users/Win 10/main.py"
False
True
Process finished with exit code 0
总结
在这篇文章中,我们已经学习了在Python中使用内置库如datetime
和calendar
以及第三方库如arrow
和pandas
来查找本月最后一天的各种方法。