文档章节

python 计算两个日期相差多少个月

 异彩飞天
发布于 2017/05/24 08:53
字数 432
阅读 23
收藏 0
点赞 0
评论 0

近期,由于业务需要计算两个日期之前相差多少个月。我在网上找了很久,结果发现万能的python,居然没有一个模块计算两个日期的月数,像Java、C#之类的高级语言,都会有(date1-date2).months的现成方法,觉得不可思议。说句实在的,一直觉得python 的日期处理模块真心不好用。

  哦,对了,别跟我说 datetime, calendar, dateutil 这些模块,因为我都试过了,都没用。有个竟然算出来还有错。datetime.timedelta只能计算出日时分秒。对年月却不支持。网上一搜,一大堆的。

  dateutil.rrule这个例子是我好不容易找到的,请看我的测试结果:

import datetime

from dateutil import rrule

d1 = datetime.date(2016, 2, 29)
d2 = datetime.date(2019, 3, 31)

months = rrule.rrule(rrule.MONTHLY, dtstart=d1, until=d2).count()

print(f"months={months}")

  看到这样的结果,我只能呵呵了。

  废话不多少,献上自己写的代码:

  该代码返回,(月,小数月)

import datetime
import calendar as c


d1 = datetime.date(2016, 2, 29)
d2 = datetime.date(2019, 3, 31)


def calmonths(startdate, enddate):
# 计算两个日期相隔月差
samemonthdate = None
try:
samemonthdate = datetime.date(enddate.year, enddate.month,
startdate.day)
except Exception as e:
print(e)
samemonthdate = datetime.date(enddate.year, enddate.month,
c.monthrange(enddate.year,
enddate.month)[1])


    holdmonths = 0
    decimalmonth = 0.0
    if samemonthdate > enddate:
        premanthdate = None
        try:
            premanthdate = datetime.date(enddate.year, enddate.month - 1,
                                             startdate.day)
        except Exception as e:
            print(e)
            premanthdate = datetime.date(enddate.year, enddate.month - 1,
                                             c.monthrange(
                                                 enddate.year,
                                                 enddate.month - 1)[1])
        currmonthdays = (samemonthdate - premanthdate).days
        holdmonths = (premanthdate.year - startdate.year
                      ) * 12 + premanthdate.month - startdate.month
        decimalmonth = (enddate - premanthdate).days / currmonthdays




    elif samemonthdate < enddate:
        nextmonthdate = None
        try:
            nextmonthdate = datetime.date(enddate.year, enddate.month + 1,
                                              startdate.day)
        except Exception as e:
            nextmonthdate = datetime.date(enddate.year, enddate.month + 1,
                                              c.monthrange(
                                                  enddate.year,
                                                  enddate.month + 1)[1])
        currmonthdays = (nextmonthdate - samemonthdate).days
        holdmonths = (samemonthdate.year - startdate.year
                      ) * 12 + samemonthdate.month - startdate.month
        decimalmonth = (enddate - samemonthdate).days / currmonthdays




    else:
        holdmonths = (enddate.year - startdate.year
                      ) * 12 + enddate.month - startdate.month




    return holdmonths, decimalmonth




months = calmonths(d1, d2)




print(f"months={months}")

欢迎各种暴力测试,有问题留言反馈。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 2
码字总数 837
作品 0
广州
6 个 Python 的日期时间库

在 Python 中有许多库可以很容易地测试、转换和读取日期和时间信息。 这篇文章是与 Jeff Triplett 一起合写的。 曾几何时,我们中的一个人(Lacey)盯了一个多小时的 Python 文档中描述日期和...

16% ⋅ 05/22 ⋅ 0

Python刷题提升——第一季(题目篇)

博客写了一年多了,也积攒了100+文章分享 感谢大家陪我一起学习 每次在评论区看到你们的疑问和鼓励,我甚是欣慰 在部分文章最后留有一些问题,大家都会踊跃给出自己的答案 除了之前的Python数...

ID王大伟 ⋅ 05/05 ⋅ 0

python高性能编程第一章读书笔记

计算机底层组件分为三大基本部分:计算单元、存储单元以及两者之间的连接。 计算单元:具有将接收到的任意输入转换成输出的能力以及改变当前处理状态的能力。CPU是最常见的计算单元。它的主要...

ma412410029 ⋅ 05/28 ⋅ 0

连 00 后学 Python 了,身为程序员的我慌了

2018 年 1 月 16 日,教育部召开新闻发布会,正式将人工智能、物联网、大数据处理划入高中新课标,并于今年秋季开始执行。这意味着,现在 16 岁的学生就要开始学习编程了! 本次核心目标:修...

dqcfkyqdxym3f8rb0 ⋅ 05/06 ⋅ 0

手把手教你用Prophet快速进行时间序列预测(附Prophet和R代码)

简介 对于任何业务而言,基于时间进行分析都是至关重要的。库存量应该保持在多少?你希望商店的客流量是多少?多少人会乘坐飞机旅游?类似这样待解决的问题都是重要的时间序列问题。 这就是时...

技术小能手 ⋅ 06/12 ⋅ 0

人脸检测(dlib和opencv)

mark一下,感谢作者分享! https://zhuanlan.zhihu.com/p/32781218 $ sudo apt-get install libgtk-3-dev $ sudo apt-get install libboost-all-dev $ pip install scipy $ pip install open......

weixin_38569817 ⋅ 05/30 ⋅ 0

Python数据科学(八)- 资料探索与资料视觉化

传送门: Python数据科学(一)- python与数据科学应用(Ⅰ) Python数据科学(二)- python与数据科学应用(Ⅱ) Python数据科学(三)- python与数据科学应用(Ⅲ) Python数据科学(四)- 数据收...

_知几 ⋅ 05/22 ⋅ 0

Python怎么利用多核cpu

原文链接http://www.cnblogs.com/stubborn412/p/4033651.html def dead_loop(): def dead_loop(): {void DeadLoop() { while (true); } } from threading import Thread lib = cdll.LoadLibr......

dby_freedom ⋅ 05/06 ⋅ 0

为什么有人说 Python 多线程是鸡肋?

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋? ...

刘志军 ⋅ 05/04 ⋅ 0

Hive中reduce个数设定

转载:https://blog.csdn.net/wisgood/article/details/42125367 我们每次执行hive的hql时,shell里都会提示一段话: ... Number of reduce tasks not specified. Estimated from input dat......

wer0735 ⋅ 04/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 41分钟前 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 48分钟前 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部