Python 学习笔记:根据输入年月区间,返回期间所有的月份
目的:
给定一个年月区间,比如:2019.01 至 2019.05,要求返回一个包含期间所有的月份的列表,比如:['2019.01', '2019.02', '2019.03', '2019.04', '2019.05']
参考博客:https://blog.csdn.net/qq_32502511/article/details/84400638
Note:参考的博客代码逻辑存在问题,若时间年份之差超过两年,比如 2014 至 2016,计算结果就不对了,我在分析了其计算逻辑后,根据自身的功能需求,对函数功能进行了改进。
思路:
这里要求得到给定区间的所有月份,那么我们先可以计算给定区间的时间差,即两者之间总共包含多少个月;之后由第一个月(起始时间)逐步累加,最终得到给定时间区间的所有月份的列表。
1.时间差计算:我们可以使用第三方库 dateutil 中的 rrule.count 函数来实现。
首先看下以下代码:
import datetime
from dateutil import rrule
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()返回的结果是一个整数。
代码实现:
根据上面的思路,定义以下函数:
import datetime
from dateutil import rrule
def get_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 < start:
print("Parameter Error: Pls input right date range,start_month can't latter than end_month")
return []
else:
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 + m
if 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 学习笔记:根据输入年月区间,返回期间所有的月份的更多相关文章
- Deep learning with Python 学习笔记(4)
本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...
- Deep learning with Python 学习笔记(1)
深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...
- python 学习笔记 12 -- 写一个脚本获取城市天气信息
近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- Python学习笔记(八)
Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...
- Python学习笔记(四)
Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...
- Python 学习笔记 - 不断更新!
Python 学习笔记 太久不写python,已经忘记以前学习的时候遇到了那些坑坑洼洼的地方了,开个帖子来记录一下,以供日后查阅. 摘要:一些报错:为啥Python没有自增 ++ 和自减 --: 0x ...
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- Deep learning with Python 学习笔记(8)
Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...
- Deep learning with Python 学习笔记(7)
介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...
随机推荐
- mysql第六篇 : MySQL索引原理与慢查询优化
浏览目录 一.索引介绍 二.索引方法 三.索引类型 四.聚合索引和辅助索引 五.测试索引 六.正确使用索引 七.组合索引 八.注意事项 九.查询计划 十.慢日志查询 十一.大数据量分页优化 一.索引介 ...
- UVA - 12113 Overlapping Squares(重叠的正方形)
题意:给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出指定的形状. 分析:2*2的纸在4*4的棋盘上总共有9种放置位置,枚举所有的放置位置即可.枚举情况总共种. #p ...
- errors exist in required project(s) xxx proceed with launch?
原因:本地更新文件和SVN有冲突..找到报错的文件.和SVN资源库的文件对比,修改即可. 一定要解决所有的冲突啊.更新的时候一定要注意有冲突的文件.不然项目无法启动. ---------------- ...
- bzoj 1832: [AHOI2008]聚会
良心题2333 三个点两两求一遍就行,最小肯定是在某2个点的lca处,(肯定让第三个人去找2个人,不能让2个人一起去找第三个人233) #include<bits/stdc++.h> #d ...
- ABP .NET CORE 连接mysql
1.安装mysql程序集,在项目XXX.EntityFrameworkCore下面添加程序集 pomelo.entityframeworkcore.mysql pomelo.entityframewo ...
- hash表系列(转)
http://www.cnblogs.com/mumuxinfei/p/4441826.html 前言: 我以前在百度的mentor, 在面试时特喜欢考察哈希表. 那时的我满是疑惑和不解, 觉得这东西 ...
- 轻量级UILabel分段点击扩展更新啦
http://www.code4app.com/thread-31445-1-1.html Tag: 项目介绍: YBAttributeTextTapAction 一行代码添加文本点击事件 效果图 S ...
- Day 12:枚举值、枚举类
jdk1.5新特性之-----枚举 问题:某些方法所接收的数据必须是在固定范围之内的, 解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用. ...
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- css 居中布局方案
position(transform css3 有些浏览器不兼容) <article id="one"> <section id="section&q ...