目的:

给定一个年月区间,比如: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 函数来实现。

首先看下以下代码:

  1. import datetime
  2. from dateutil import rrule
  3. start=datetime.datetime.strptime('2019.01','%Y.%m')
  4. end=datetime.datetime.strptime('2019.05','%Y.%m')
  5. print(start.month)
  6. 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()返回的结果是一个整数。

代码实现:

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

  1. import datetime
  2. from dateutil import rrule
  3. def get_each_month(start_month, end_month):
  4. if str(start_month).count('.') != 1 or str(end_month).count('.') != 1:
  5. print("Parameter Error: Pls input a string such as '2019.01'")
  6. return[]
  7. if int(str(start_month).split('.')[1]) > 12 or int(str(end_month).split('.')[1]) > 12:
  8. print('Parameter Error: Pls input correct month range such as between 1 to 12')
  9. return[]
  10. if int(str(start_month).split('.')[1]) == 0 or int(str(end_month).split('.')[1]) == 12:
  11. print('Parameter Error: Pls input correct month range such as between 1 to 12')
  12. return[]
  13. start = datetime.datetime.strptime(start_month, "%Y.%m")
  14. end = datetime.datetime.strptime(end_month, "%Y.%m")
  15. month_count = rrule.rrule(rrule.MONTHLY,dtstart=start,until=end).count() #计算总月份数
  16. if end < start:
  17. print("Parameter Error: Pls input right date range,start_month can't latter than end_month")
  18. return []
  19. else:
  20. list_month = []
  21. year = int(str(start)[:7].split('-')[0]) #截取起始年份
  22. for m in range(month_count): #利用range函数填充结果列表
  23. month = int(str(start)[:7].split('-')[1]) #截取起始月份,写在for循环里,作为每次迭代的累加基数
  24. month = month + m
  25. if month > 12:
  26. if month%12 > 0:
  27. month = month%12 #计算结果大于12,取余数
  28. if month==1:
  29. year += 1 #只需在1月份的时候对年份加1,注意year的初始化在for循环外
  30. else:
  31. month = 12
  32. if len(str(month))==1:
  33. list_month.append(str(year) + '.0' + str(month))
  34. else:
  35. list_month.append(str(year) + '.' + str(month))
  36. return list_month

调用结果如下:

Python 学习笔记:根据输入年月区间,返回期间所有的月份的更多相关文章

  1. Deep learning with Python 学习笔记(4)

    本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...

  2. Deep learning with Python 学习笔记(1)

    深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...

  3. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  4. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  5. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  6. Python学习笔记(四)

    Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...

  7. Python 学习笔记 - 不断更新!

    Python 学习笔记 太久不写python,已经忘记以前学习的时候遇到了那些坑坑洼洼的地方了,开个帖子来记录一下,以供日后查阅. 摘要:一些报错:为啥Python没有自增 ++ 和自减 --: 0x ...

  8. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

  9. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  10. Deep learning with Python 学习笔记(7)

    介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...

随机推荐

  1. CentOS 7 下oracle 11G R2 ADG 搭建

    本文记录ADG搭建操作步骤,首先在虚拟机CentOS中安装并配置好oracle 11g R2(具体安装步骤在我的另一篇博客中),然后拷贝一份虚拟机,修改新虚拟机的主机名和ip配置,这时候主库和备库是一 ...

  2. POJ 3096:Surprising Strings

    Surprising Strings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6258   Accepted: 407 ...

  3. [题解] LuoguP4389 付公主的背包

    这个题太神辣- 暴力背包就能获得\(30\)分的好成绩...... \(60\)分不知道咋搞..... 所以直接看\(100\)分吧\(QwQ\) 用一点生成函数的套路,对于一个体积为\(v\)的物品 ...

  4. ACM&OI 基础数论算法专题

    ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...

  5. java基础——深拷贝和浅拷贝的区别

    浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝. 深拷贝:对基本数据类型进行值传递,对引用数据类型船舰一个新的对象,并复制内容,这是深拷贝.

  6. VS.NET中的常用控件和类型的命名规范

    表1  命名规范 VS名称 简写 VS名称 简写 数据类型 Array arr Boolean bln Byte byt Char Chr Date Time dtm Decimal dtm Doub ...

  7. Day 12:枚举值、枚举类

    jdk1.5新特性之-----枚举 问题:某些方法所接收的数据必须是在固定范围之内的,  解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用. ...

  8. mybatis+maven+父子多模块进行crud以及动态条件查询

    使用IDEA创建maven项目,File→New→Project→maven→Next→填写GroupId(例:com.zyl)和ArtifactId(mybatis-demo-parent)→Nex ...

  9. python3 sort list

    1. 对元素指定的某一部分进行排序,关键字排序 s = ['release.10.txt','release.1.txt','release.2.txt','release.14.txt','rele ...

  10. MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信

    服务器端发送数据给客户端 先看服务器端: CAsyncSocket m_sockSend;                       //声明一个Socket对象 点击发送数据后,执行下面这些动作 ...