之前我在查看日历模块的文档时没有注意到这一点,但名为monthrange的方法提供了以下信息:

月份(年份,月份)

返回指定年份和月份的月份第一天的工作日和月份中的天数。

>>> import calendar >>> calendar.monthrange(2002,1) (1, 31) >>> calendar.monthrange(2008,2) (4, 29) >>> calendar.monthrange(2100,2) (0, 28)

所以:

calendar.monthrange(year, month)[1]

似乎是最简单的方法。

为了清楚monthrange , monthrange支持闰年:

>>> from calendar import monthrange >>> monthrange(2012, 2) (2, 29)

我以前的答案仍然有效,但显然是不理想的。

如果你不想导入calendar模块,一个简单的两步function也可以是:

import datetime def last_day_of_month(any_day): next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail return next_month - datetime.timedelta(days=next_month.day)

输出:

>>> for month in range(1, 13): ... print last_day_of_month(datetime.date(2012, month, 1)) ... 2012-01-31 2012-02-29 2012-03-31 2012-04-30 2012-05-31 2012-06-30 2012-07-31 2012-08-31 2012-09-30 2012-10-31 2012-11-30 2012-12-31

编辑:见@Blair康拉德的答案更干净的解决scheme

>>> import datetime >>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1) datetime.date(2000, 1, 31) >>>

编辑:看到我的其他答案 。 它有比这更好的实现,我离开这里,以防万一有人想看看如何“自己动手”计算器。

约翰·米利肯给出了一个很好的答案,计算下个月的第一天会增加复杂性。

以下不是特别优雅,但要找出任何给定date所在月份的最后一天,您可以尝试:

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) >>> last_day_of_month(datetime.date(2002, 1, 17)) datetime.date(2002, 1, 31) >>> last_day_of_month(datetime.date(2002, 12, 9)) datetime.date(2002, 12, 31) >>> last_day_of_month(datetime.date(2008, 2, 14)) datetime.date(2008, 2, 29)

这实际上很容易与dateutil.relativedelta (软件包python-datetutil为点)。 day=31将始终总是返回该月的最后一天。

例:

from datetime import datetime from dateutil.relativedelta import relativedelta date_in_feb = datetime.datetime(2013, 2, 21) print datetime.datetime(2013, 2, 21) + relativedelta(day=31) # End-of-month >>> datetime.datetime(2013, 2, 28, 0, 0)

另一个解决办法是做这样的事情:

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

并使用这样的function:

>>> >>> last_day_of_month(2008, 2) datetime.date(2008, 2, 29) >>> last_day_of_month(2009, 2) datetime.date(2009, 2, 28) >>> last_day_of_month(2008, 11) datetime.date(2008, 11, 30) >>> last_day_of_month(2008, 12) datetime.date(2008, 12, 31)

使用relativedelta你会得到像这样的月份的最后date:

from dateutil.relativedelta import relativedelta last_date_of_month = datetime(mydate.year,mydate.month,1)+relativedelta(months=1,days=-1)

这个想法是获得一个月的第一天,并使用relativedelta提前1个月和1天后,所以你会得到你想要的月份的最后一天。

from datetime import timedelta (any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)

>>> import datetime >>> import calendar >>> date = datetime.datetime.now() >>> print date 2015-03-06 01:25:14.939574 >>> print date.replace(day = 1) 2015-03-01 01:25:14.939574 >>> print date.replace(day = calendar.monthrange(date.year, date.month)[1]) 2015-03-31 01:25:14.939574

import datetime now = datetime.datetime.now() start_month = datetime.datetime(now.year, now.month, 1) date_on_next_month = start_month + datetime.timedelta(35) start_next_month = datetime.datetime(date_on_next_month.year, date_on_next_month.month, 1) last_day_month = start_next_month - datetime.timedelta(1)

对我来说这是最简单的方法:

selected_date = date(some_year, some_month, some_day) if selected_date.month == 12: # December last_day_selected_month = date(selected_date.year, selected_date.month, 31) else: last_day_selected_month = date(selected_date.year, selected_date.month + 1, 1) - timedelta(days=1)

然后你可以得到这个月的最后一天:

import arrow arrow.utcnow().ceil('month').date()

这将返回一个date对象,然后您可以进行操作。

这并没有解决主要问题,但是在一个月内得到最后一个工作日的一个很好的方法是使用calendar.monthcalendar ,它返回一个datematrix,星期一作为第一列到最后一个星期日。

# 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

整个[0:-2]事情是刮掉周末的专栏,把它们扔掉。 月份以外的date用0表示,所以最大值忽略它们。

numpy.ravel的使用并不是绝对必要的,但我讨厌依靠numpy.ndarray.max这个单纯的约定 ,如果不告诉哪个轴计算结束,数组将会变平。

使用pandas!

def isMonthEnd(date): return date + pd.offsets.MonthEnd(0) == date isMonthEnd(datetime(1999, 12, 31)) True isMonthEnd(pd.Timestamp('1999-12-31')) True isMonthEnd(pd.Timestamp(1965, 1, 10)) False

我更喜欢这种方式

import datetime import calendar date=datetime.datetime.now() month_end_date=datetime.datetime(date.year,date.month,1) + datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1] - 1)

你可以自己计算结束date。 简单的逻辑是从下个月的start_date减去一天。

python 判断每月最后一天_在Python中获取本月的最后一天相关推荐

  1. python判断回文_用python判断回文数

    信息举报 时间:2020-11-23 本页为您甄选多篇描写用python判断回文数,用python判断回文数精选,用python判断回文数大全,有议论,叙事 ,想象等形式.文章字数有400字.600字 ...

  2. python开发每月工资_做python开发想要月薪20K不会这些怎么行?

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  3. python判断nan格式_关于Python中Inf与Nan的判断问题详解

    大家都知道 在Python 中可以用如下方式表示正负无穷: float("inf") # 正无穷 float("-inf") # 负无穷 利用 inf(infi ...

  4. python 判断数字连续_关于python:检测列表中的连续整数

    本问题已经有最佳答案,请猛点这里访问. 我有一个包含这样的数据的列表: [1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14] 我想打印出连续整数的范围: 1-4, 7-8, 1 ...

  5. python获取上个月最后一天_在Python中获取本月的最后一天

    Is there a way using Python's standard library to easily determine (i.e. one function call) the last ...

  6. python分析每月销售数据_利用Python进行某单品销售数据分析

    本篇文章将利用Python工具对一份某商品的销售数据进行如下几个方面的分析,结合业务场景,构件常用业务指标,以从销售数据中挖掘出其潜在的商业价值,促进运营.用户消费趋势分析: 用户个体消费分析: 用户 ...

  7. python判断是否闰年_【python实例】判断输入年份是否是闰年

    原博文 2019-12-24 10:24 − 1 ''' 2 求给定的年份,是否是闰年. 3 满足以下两点中任意一点就是闰年 4 A:能被4整除,但是不能被100整出. 5 B:能被400整除. 6 ...

  8. python判断字母大小写_用python如何判断字符的大小写

    Python提供了isupper(),islower(),istitle()方法用来判断字符串的大小写. 1.isupper()方法 Python isupper() 方法检测字符串中所有的字母是否都 ...

  9. python判断能否组成三角形_【python+任意输入3个数+判断能否组成三角形】 - #1

    2015年07月18 - 任意输入3个数,判断能否组成三角形,并输出三角形为等边/等腰/直角/普通三角形. 三角形:两边之和大于第三边 直角三角形:勾股定理 #!/usr/bin/python # - ...

  10. python判断复数浮点数_荐Python数据类型(整数,浮点数,复数,字符串,format()用法)(超详细笔记)...

    一.整数类型 1.与数学中的整数概念一致,没有取值范围限制. 2.整数类型共有4种进制表示:十进制.二进制.八进制. 十六进制,默认十进制,其他进制需增加引导符(不区分 大小写) 二进制 0b或0B, ...

最新文章

  1. 小程序客服消息推送自动回复_如何让小程序客服消息根据用户输入关键词自动回复图片?...
  2. python读txt转array_np.array和txt文件的转换
  3. canvas三环加载进度条
  4. 使WEBBROWSER 可编辑
  5. Dynamics CRM2016 Web API之更新记录
  6. 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法
  7. 实战:基于 Spring 的应用配置如何迁移至阿里云应用配置管理 ACM
  8. NoClassDefFoundError 解决方法
  9. MTK 驱动(51)---TP 驱动移植
  10. ES6新特性_ES6集合实践---JavaScript_ECMAScript_ES6-ES11新特性工作笔记031
  11. [Rust]cargo run时error: linker `link.exe` not found
  12. 常用排序算法(八)桶排序
  13. 中国土地市场网数据爬取
  14. linux 2t gpt 分区,linux大于2T的磁盘使用GPT分区方式
  15. java 计算日期相差天数_Java 计算两个日期相差的天数
  16. Office - - Excel宏录制批量处理格式相同文件
  17. 计算机学报在线阅读,计算机学报CHIN.pdf
  18. 中国式“高定美学”燃爆广州秀场!「琢我」之气场与「莲玉芳华」之优雅
  19. 【技术贴】解决前台js传参中文乱码
  20. html之简单新闻网制作

热门文章

  1. java毕业设计_基于MVC的公司报账系统
  2. 我收藏的阿里云盘资源,牛逼!!
  3. 关于用Unity实现校区AR导航毕业设计的建议
  4. 群友问题,如何面对繁杂的数据需求?
  5. MySQL有哪些“饮鸩止渴”提高性能的方法?
  6. 提高睡眠质量的牛皮凉席!
  7. Tomcat修行之路-7.Tomcat-Mapper组件机制以及请求处理机制
  8. 华为OD机试 - 勾股数元组
  9. Google Earth Engine(GEE)——NASA-USDA增强型SMAP全球土壤水分数据以10公里的空间分辨率提供全球的土壤水分信息
  10. 助力自己在金融领域中更加游刃有余的人大与加拿大女王大学金融硕士项目你读到了吗?