from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
3
如果你想制作自己的小功能,这是一个很好的起点:
def eomday(year, month):
"""returns the number of days in a given month"""
days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
d = days_per_month[month - 1]
if month == 2 and (year % 4 == 0 and year % 100 != 0 or year % 400 == 0):
d = 29
return d
为此,您必须了解闰年的规则:
每四年一次
除了每100年一次
但每400年一次
97
import datetime
today = datetime.datetime.today() # currentr day for date example
last_date = today + relativedelta(day=31)
print "Date:", last_date.date(),"Day:", last_date.date().day
# Some random date.
some_date = datetime.date(2012, 5, 23)
# Get last weekday
last_weekday = np.asarray(calendar.monthcalendar(some_date.year, some_date.month))[:,0:-2].ravel().max()
print last_weekday
31
from datetime import datetime
def last_day_of_month(year, month):
""" Work out the last day of the month """
last_days = [31, 30, 29, 28, 27]
for i in last_days:
try:
end = datetime(year, month, i)
except ValueError:
continue
else:
return end.date()
return None
import time
from datetime import datetime, date
from datetime import timedelta
from dateutil import relativedelta
start_date = fields.Date(
string='Start Date',
required=True,
)
end_date = fields.Date(
string='End Date',
required=True,
)
_defaults = {
'start_date': lambda *a: time.strftime('%Y-%m-01'),
'end_date': lambda *a: str(datetime.now() + relativedelta.relativedelta(months=+1, day=1, days=-1))[:10],
}
0
如果你传递一个日期范围,你可以使用这个:
def last_day_of_month(any_days):
res = []
for any_day in any_days:
nday = any_day.days_in_month -any_day.day
res.append(any_day + timedelta(days=nday))
return res
28 回答
编辑:请参阅@Blair Conrad的答案以获得更清洁的解决方案
这是另一个答案 . 无需额外包裹 .
获取下个月的第一天并从中减去一天 .
这是一个基于python lambdas的解决方案:
next_month
lambda找到下个月第一天的元组表示,并转到下一年 .month_end
lambda将日期(dte
)转换为元组,应用next_month
并创建新日期 . 那么"month's end"就是下个月的第一天减去timedelta(days=1)
.当我查看documentation for the calendar module时,我没有注意到这一点,但是一个名为monthrange的方法提供了以下信息:
所以:
似乎是最简单的方法 .
需要明确的是,
monthrange
也支持闰年:My previous answer仍然有效,但显然不是最理想的 .
最简单的方法(无需导入日历)是获取下个月的第一天,然后从中减去一天 .
输出:
PS: 与
import calendar
方法相比,此代码运行速度更快;见下文:OUTPUT:
此代码假定您需要该月的最后一天的日期(即,不仅仅是DD部分,而是整个YYYYMMDD日期)
如果您愿意使用外部库,请查看http://crsmithdev.com/arrow/
然后你可以通过以下方式获得本月的最后一天:
这将返回一个日期对象,然后您可以进行操作 .
输出:
这将打印当月的最后一天 . 在此示例中,它是2016年5月15日 . 因此您的输出可能不同,但输出将是当前月份的天数 . 如果您想通过运行每日cron作业来检查当月的最后一天,那就太棒了 .
所以:
输出:
除非它是这个月的最后一天 .
使用
dateutil.relativedelta
(包为python-datetutil for pip)实际上非常简单 .day=31
将始终返回该月的最后一天 .例:
如果您不想导入
calendar
模块,那么简单的两步功能也可以是:输出:
用熊猫!
编辑:见my other answer . 它有一个比这个更好的实现,我留在这里,以防有人有兴趣看到一个人如何"roll your own"计算器 .
@John Millikin给出了一个很好的答案,计算下个月第一天的复杂性增加了 .
以下不是特别优雅,但要弄清楚任何给定日期所在的月份的最后一天,您可以尝试:
我更喜欢这种方式
在下面的代码中'get_last_day_of_month(dt)'会给你这个,日期是字符串格式,如'YYYY-MM-DD' .
如果你想制作自己的小功能,这是一个很好的起点:
为此,您必须了解闰年的规则:
每四年一次
除了每100年一次
但每400年一次
output:
对我来说这是最简单的方法:
这并没有解决主要问题,但是在一个月中获得最后一个工作日的一个好方法是使用
calendar.monthcalendar
,它返回一个日期矩阵,以星期一为第一列,直到星期日为最后一个 .整个
[0:-2]
事情是削减周末列并将它们扔出去 . 超出月份的日期用0表示,因此max有效地忽略它们 .numpy.ravel
的使用并不是绝对必要的,但我讨厌依赖于numpy.ndarray.max
如果没有告诉哪个轴计算过来会使数组变平的惯例 .另一个解决方案是做这样的事情:
并使用这样的功能:
要获取本月的最后日期,我们会执行以下操作:
现在解释一下我们在这里做了什么,我们将它分为两部分:
首先是获得我们使用monthrange的当月的天数,Blair Conrad已经提到了他的解决方案:
第二个是在replace的帮助下获取最后一个日期,例如
当我们将它们组合在一起时,我们得到了一个动态的解决方案 .
我希望,它非常有用..试试这种方式..我们必须要导入一些包
如果你传递一个日期范围,你可以使用这个:
我有一个简单的解决方案:
你可以使用relativedelta https://dateutil.readthedocs.io/en/stable/relativedelta.html
month_end = <your datetime value within the month> + relativedelta(day=31)
,这将给你最后一天 .使用
relativedelta
你会得到这样的月份的最后一个日期:这个想法是在每个月的第一天使用
relativedelta
提前1个月和1天返回,这样你就可以得到你想要的月份的最后一天 .您可以自己计算结束日期 . 简单的逻辑是从下个月的start_date中减去一天 . :)
所以写一个自定义方法,
调用,
它将返回本月的结束日期 . 将任何日期传递给此功能 . 返回该月的结束日期 .