有趣的是,您的代码输出到:5,这意味着,正如 cmets 中所建议的,您可能对每个月的持续时间感兴趣并且您不想对结果进行四舍五入。不幸的是,timedelta 对象在这种情况下对您不起作用,因为根据定义,时差不包含获取您感兴趣的月份持续时间所需的信息。
你应该看看这里:
Python: Difference of 2 datetimes in months
他们使用calendar 而不是dateutil 讨论解决方案。
否则,如果您对近似(和四舍五入)的估计感到满意,您可以通过以下方式进行足够接近:
DAYS_PER_MONTH = 30 # or 365.0 / 12.0 for more precision
datetime_diff = date2 - date1
print(datetime_diff.days / DAYS_PER_MONTH) # '//' for floored result
如果您想返回一些适用于您的数据的代码(但不是适用于所有数据,例如闰年、闰秒等),请查看此处:
MONTH_NUM_DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
YEAR_LENGTH = 365.25 # average year duration, including leap years
def num_days_in_months(
begin_month, end_month, month_duration=MONTH_NUM_DAYS):
begin_month, end_month = sorted((begin_month, end_month))
return sum(month_duration[begin_month:end_month])
def get_num_months(begin_date, end_date, num_days_per_year=YEAR_LENGTH):
begin_month = begin_date.month
end_month = end_date.month
month_diff = abs(end_month - begin_month)
num_days = (end_date - begin_date).days
num_days_within_year = num_days % num_days_per_year
num_months = num_days // num_days_per_year
num_days_max = num_days_in_months(begin_month, end_month)
print(num_months, month_diff)
if num_days_within_year < num_days_max:
num_months += month_diff - 1
else:
num_months += month_diff
return num_months