Python:月中2个日期时间的差异[重复]
Posted
技术标签:
【中文标题】Python:月中2个日期时间的差异[重复]【英文标题】:Python: Difference of 2 datetimes in months [duplicate] 【发布时间】:2011-08-10 18:04:30 【问题描述】:可能重复:Best way to find the months between two dates (in python)
我想知道我怎样才能得到这种差异的确切月数:
date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')
date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')
date2-date1 结果
datetime.timedelta(183, 43200)
我想知道确切的月数,在这种情况下它应该返回 5 而不是 6(因为小时)
【问题讨论】:
这里已经回答了这个问题:***.com/questions/4039879/… 一旦您确定了“确切的月数”的含义,这将更容易回答。一个月不是固定长度的持续时间;它可以从 28 天到 31 天不等。 1 月 1 日和 2 月 1 日比 2 月 1 日和 3 月 1 日相距更远;你把这两个时间间隔都称为“正好 1 个月”吗? This post 搞定了!使用dateutil.relativedelta
。
【参考方案1】:
你可以使用python-dateutil。
In [4]: from datetime import datetime
In [5]: date1 = datetime.strptime(str('2011-08-15 12:00:00'), '%Y-%m-%d %H:%M:%S')
In [6]: date2 = datetime.strptime(str('2012-02-15'), '%Y-%m-%d')
In [7]: from dateutil import relativedelta
In [8]: r = relativedelta.relativedelta(date1, date2)
In [9]: r
Out[9]: relativedelta(months=-5, days=-30, hours=-12)
【讨论】:
虽然:relativedelta.relativedelta(date(2015, 9, 30), date(2015, 10, 1)).months
产生 0 这是正确的,但如果您想知道月份不同,可能无法反映预期结果
这对我有用。您只需计算年数,乘以 12 并加上月数。【参考方案2】:
只有您知道必须满足的要求,但是这两个日期之间有 183 天和 43200 SI 秒这一事实凸显了在确定“真正”是多少个月时固有的主观性。
一个月是 30 天,还是 (365 / 12) 天,还是 ((365 * 4 + 1) / 48) 天,还是 ...?
一天总是 86400 秒,或者您是否计算历史闰秒,或者您是否预测未来日期的闰秒?
这些决定会影响您似乎希望的算法在接近这些边界的某些输入日期为您提供的答案。
在我看来,为此目的将月份视为原子时间单位并使用以下公式更直观:(date2.year - date1.year) * 12 + (date2.month - date1.month)
【讨论】:
这很有效,解释得很好,解决了我的问题。【参考方案3】:使用calendar
模块查询每个月有多少天,可以简单的统计月份。
from calendar import monthrange
from datetime import datetime, timedelta
def monthdelta(d1, d2):
delta = 0
while True:
mdays = monthrange(d1.year, d1.month)[1]
d1 += timedelta(days=mdays)
if d1 <= d2:
delta += 1
else:
break
return delta
【讨论】:
【参考方案4】:这样做的好处是模块依赖少,没有循环——直接计算就可以找到月份。
import datetime as dt
def months_between(date1,date2):
if date1>date2:
date1,date2=date2,date1
m1=date1.year*12+date1.month
m2=date2.year*12+date2.month
months=m2-m1
if date1.day>date2.day:
months-=1
elif date1.day==date2.day:
seconds1=date1.hour*3600+date1.minute+date1.second
seconds2=date2.hour*3600+date2.minute+date2.second
if seconds1>seconds2:
months-=1
return months
date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S')
date2 = dt.datetime.strptime('2012-02-15', '%Y-%m-%d')
print(months_between(date1,date2))
# 5
date1 = dt.datetime.strptime('2011-08-15 12:00:00', '%Y-%m-%d %H:%M:%S')
date2 = dt.datetime.strptime('2012-02-15 11:59:00', '%Y-%m-%d %X')
print(months_between(date1,date2))
# 5
date2 = dt.datetime.strptime('2012-02-15 12:00:00', '%Y-%m-%d %X')
print(months_between(date1,date2))
# 6
date2 = dt.datetime.strptime('2012-02-15 12:00:01', '%Y-%m-%d %X')
print(months_between(date1,date2))
# 6
【讨论】:
以上是关于Python:月中2个日期时间的差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何计算Python Pandas中两列之间的日期差异[重复]