目的:

给定一个年月区间,比如:2019.01 至 2019.05,要求返回一个包含期间所有的月份的列表,比如:['2019.01', '2019.02', '2019.03', '2019.04', '2019.05']

Note:参考的博客代码逻辑存在问题,若时间年份之差超过两年,比如 2014 至 2016,计算结果就不对了,我在分析了其计算逻辑后,根据自身的功能需求,对函数功能进行了改进。

思路:

这里要求得到给定区间的所有月份,那么我们先可以计算给定区间的时间差,即两者之间总共包含多少个月;之后由第一个月(起始时间)逐步累加,最终得到给定时间区间的所有月份的列表。

1.时间差计算:我们可以使用第三方库 dateutil 中的 rrule.count 函数来实现。

首先看下以下代码:

importdatetimefrom dateutil importrrule

start=datetime.datetime.strptime('2019.01','%Y.%m')

end=datetime.datetime.strptime('2019.05','%Y.%m')print(start.month)

rrule.rrule(rrule.MONTHLY,dtstart=start,until=end).count()

输出结果如下:

在上面的代码中,我们使用了 rrule.count 函数 以月份为尺度,计算量两个时间段之间的差,得到了 2019.01 至 2019.05 这段时间里,总共有5个月。

2.累加计算每个月:在这里我们可以利用 for 循环以及 range() 函数,根据总月份数量,逐步累加,比如:2019.01 - 2019.05 共5个月,从0到4进行迭代,由 1+0=1 到 1+4=5,即可得到所有月份;另外,当月份迭代累加结果超过12时,对累加结果除以12取余,并对年份进行加1,即可得到正确的年月时间。

解析:

Python 第三方库 dateutil 提供了 rrule.count() 方法,方便我们计算时间差,它有以下特点:

① rrule 方法允许用户根据日期(DAILY),星期(WEEKLY),月(MONTHLY),年(YEARLY)来设置时间差计算的尺度。

② count()返回的结果是一个整数。

代码实现:

根据上面的思路,定义以下函数:

importdatetimefrom dateutil importrruledefget_each_month(start_month, end_month):if str(start_month).count('.') != 1 or str(end_month).count('.') != 1:print("Parameter Error: Pls input a string such as '2019.01'")return[]if int(str(start_month).split('.')[1]) > 12 or int(str(end_month).split('.')[1]) > 12:print('Parameter Error: Pls input correct month range such as between 1 to 12')return[]if int(str(start_month).split('.')[1]) == 0 or int(str(end_month).split('.')[1]) == 12:print('Parameter Error: Pls input correct month range such as between 1 to 12')return[]

start= datetime.datetime.strptime(start_month, "%Y.%m")

end= datetime.datetime.strptime(end_month, "%Y.%m")

month_count= rrule.rrule(rrule.MONTHLY,dtstart=start,until=end).count() #计算总月份数

if end

list_month=[]

year= int(str(start)[:7].split('-')[0]) #截取起始年份

for m in range(month_count): #利用range函数填充结果列表

month = int(str(start)[:7].split('-')[1]) #截取起始月份,写在for循环里,作为每次迭代的累加基数

month = month +mif month > 12:if month%12 >0:

month= month%12 #计算结果大于12,取余数

if month==1:

year+= 1 #只需在1月份的时候对年份加1,注意year的初始化在for循环外

else:

month= 12

if len(str(month))==1:

list_month.append(str(year)+ '.0' +str(month))else:

list_month.append(str(year)+ '.' +str(month))return list_month

调用结果如下:

python输入一个区间_Python 学习笔记:根据输入年月区间,返回期间所有的月份...相关推荐

  1. python的基本数据结构_Python学习笔记——基本数据结构

    列表list List是python的一个内置动态数组对象,它的基本使用方式如下: shoplist = ['apple', 'mango', 'carrot', 'banana'] print 'I ...

  2. python 异步加载_Python学习笔记4——爬取异步加载数据

    一.什么是异步加载? 在之前的学习笔记中,爬取的网页是需要手动翻页的网址,但是一些网站是通过自动加载翻页的,如knewone网页.浏览knewone的官网就能发现,当下拉到网页最下端时,网站会自动加载 ...

  3. python查看方法作用_python学习笔记1,新手小白也能看得懂

    这是酸菜在风变编程上学习python时积累的学习笔记,希望能帮到同样也在学习中的小伙伴.持续更新~ 第0关 Print()函数 (1)不带引号:让计算机读懂括号里的内容,打印最终的结果 例:print ...

  4. python 坐标轴 单位刻度_Python学习笔记(matplotlib篇)--坐标轴刻度

    python学习笔记--坐标轴刻度 所用的库及环境: ide:pycharm python环境:python3.7 matplotlib:   matplotlib 1.11 numpy:  nump ...

  5. python的基本数据结构_python学习笔记-基本数据结构

    Python 学习笔记-1 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护 python 基本情况 代 ...

  6. python创建实例属性_Python学习笔记__6.5章 实例属性和类属性

    # 这是学习廖雪峰老师python教程的学习笔记 1.概览 1.1.实例绑定属性 class Student(object): def __init__(self, name): self.name ...

  7. python __name__怎么使用_python学习笔记26(python中__name__的使用)

    在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以import它给其他客户使用,这两种情况不一样. 1. 如果模块是被导入 ...

  8. python编辑器文字放大_python学习笔记000

    写在最前面 其实想学习编程很久了,以前也陆陆续续学习过一段时间的编程,但总是半途而废,经过我长达三秒钟的思考,总结出以下两个方面的原因: 1.没有学习的压力.因为我不是程序员,编程不是我吃饭的家伙,会 ...

  9. python的continue用法_Python学习笔记之Break和Continue用法分析

    本文实例讲述了Python学习笔记之Break和Continue用法.分享给大家供大家参考,具体如下: Python 中的Break 和 Continue break:控制何时循环应该结束 conti ...

  10. python中continue用法_Python学习笔记之Break和Continue用法分析

    本文实例讲述了Python学习笔记之Break和Continue用法.分享给大家供大家参考,具体如下: Python 中的Break 和 Continue break:控制何时循环应该结束 conti ...

最新文章

  1. 对不队——Alpha冲刺
  2. 期盼的中国SB秀终于开始了
  3. withMisfireHandlingInstruction
  4. Prim和Kruskal算法
  5. Linux文本三剑客超详细教程---grep、sed、awk
  6. iOS开发中的火星坐标系及各种坐标系转换算法
  7. 百度站长俱乐部SEO提问收集-7
  8. 数学基础修炼手册-数学分析-凸优化
  9. 中介管理系统php源代码,PHP房产中介管理系统小程序源码8.0.5 后台+前端
  10. MySQL5及更高版本的jar包下载(jdbc)及常见问题解决
  11. 匿名上位机V7波形显示教程
  12. 美团上交开源PromptDet:无需标注,开放世界的目标检测器
  13. django+javascrpt+python实现私有云盘代码
  14. chrome 插件 click 无效
  15. 17.2.3 通过查看triggers数据表中的数据查看触发器的信息
  16. ios 手写键盘闪退问题 UIKBBlurredKeyView candidateList
  17. mac mysql中文乱码问题(亲测有效)
  18. 2022-08-04 Brighthouse: An Analytic DataWarehouse for Ad-hoc Queries
  19. Python技术手册 · 函数的多返回值&文件操作
  20. WiFi 4: 802.11n 白皮书

热门文章

  1. UltraEdit 与 正则表达式 [转]
  2. 在阿里云上安装MongoDB,并且远程连接
  3. redhat7.3-samba服务器配置
  4. GEF: 图形拖拽处理
  5. OpenGL学习(二)用户与交互
  6. 内核parameter mem解析
  7. 失焦事件触发_JavaScript event 事件详解
  8. 初识SONiC,官方文档
  9. 同步与互斥的基本原理
  10. Android分区查看方法