用Python查找每月的最后一天

要记住每个月的最后一天,并对其加以确定,这可能是一个挑战。你有没有想过,应该有一个计算机程序,只需几行代码就能向你显示任何一年中任何月份的最后一天?

这篇文章将教我们如何创建Python程序,让我们使用标准的Python库轻松找到每月的最后一天。我们将使用内置库,如calendardatetime ,以及一些第三方库,如pandasarrow ,在Python中查找每月的最后一天。

使用Python中的日历库查找本月的最后一天

在这一节中,我们将使用内置的Python库calendar 来查找本月的最后一天。

这个程序使用calendar 子函数monthrange ,它接收了两个参数,yearmonth ,并返回一个键对值(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 库。创建了两个变量,yearmonth ,接受年和月的输入。子函数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()yearmonth 。在一个数组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,来查找本月的最后一天。这里,程序导入了两个库包 –datetimepandas

创建了一个方法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中使用内置库如datetimecalendar 以及第三方库如arrowpandas 来查找本月最后一天的各种方法。