python 計(jì)算兩個(gè)日期相差多少個(gè)月實(shí)例代碼
近期,由于業(yè)務(wù)需要計(jì)算兩個(gè)日期之前相差多少個(gè)月。我在網(wǎng)上找了很久,結(jié)果發(fā)現(xiàn)萬能的python,居然沒有一個(gè)模塊計(jì)算兩個(gè)日期的月數(shù),像Java、C#之類的高級(jí)語言,都會(huì)有(date1-date2).months的現(xiàn)成方法,覺得不可思議。說句實(shí)在的,一直覺得python 的日期處理模塊真心不好用。
哦,對(duì)了,別跟我說 datetime, calendar, dateutil 這些模塊,因?yàn)槲叶荚囘^了,都沒用。有個(gè)竟然算出來還有錯(cuò)。datetime.timedelta只能計(jì)算出日時(shí)分秒。對(duì)年月卻不支持。網(wǎng)上一搜,一大堆的。
dateutil.rrule這個(gè)例子是我好不容易找到的,請(qǐng)看我的測(cè)試結(jié)果:
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}")

看到這樣的結(jié)果,我只能呵呵了。
廢話不多少,獻(xiàn)上自己寫的代碼:
該代碼返回,(月,小數(shù)月)
import datetime
import calendar as c
d1 = datetime.date(2016, 2, 29)
d2 = datetime.date(2019, 3, 31)
def calmonths(startdate, enddate):
# 計(jì)算兩個(gè)日期相隔月差
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}")

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能
一款跨平臺(tái)/無依賴的自動(dòng)化測(cè)試工具,目測(cè)只能控制鼠標(biāo)/鍵盤/獲取屏幕尺寸/彈出消息框/截屏。這篇文章主要介紹了python PyAutoGUI 模擬鼠標(biāo)鍵盤操作和截屏功能,需要的朋友可以參考下2019-08-08
python使用生成器實(shí)現(xiàn)可迭代對(duì)象
這篇文章主要為大家詳細(xì)介紹了python如何使用生成器實(shí)現(xiàn)可迭代對(duì)象,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
使用Python開發(fā)一個(gè)Word文檔批量合并工具
我們經(jīng)常需要將多個(gè)Word文檔合并成一個(gè)完整的文檔,無論是整理項(xiàng)目報(bào)告、匯編會(huì)議紀(jì)要,還是制作培訓(xùn)材料,手動(dòng)復(fù)制粘貼不僅效率低下,還容易出錯(cuò),今天,我將分享如何使用Python開發(fā)一個(gè)功能完善的Word文檔批量合并工具,需要的朋友可以參考下2025-05-05
python 實(shí)現(xiàn)"神經(jīng)衰弱"翻牌游戲
這篇文章主要介紹了python 實(shí)現(xiàn)"神經(jīng)衰弱"游戲,幫助大家更好的理解和使用python的pygame庫,感興趣的朋友可以了解下2020-11-11
Python中三種時(shí)間格式轉(zhuǎn)換的方法
本文主要介紹了Python中三種時(shí)間格式轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Python使用scipy.fft進(jìn)行大學(xué)經(jīng)典的傅立葉變換
傅里葉變換是在高數(shù)是一個(gè)很重要的知識(shí)點(diǎn),本文將介紹Python使用scipy.fft進(jìn)行大學(xué)經(jīng)典的傅立葉變換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
python第三方包安裝路徑site-packages下.libs作用詳解
這篇文章主要為大家介紹了python?第三方包安裝路徑?site-packages?下面的以?.libs?結(jié)尾的路徑作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

