2016-12-17 154 views
4

我试图在月份之间得到date1和date2之间的月数。结果只是简单的2016-12减去2016-5,这是7.我只知道如何得到int的日子,有人教我如何得到结果在多个月,这是7?减去月份的月份

import pandas as pd 
import numpy as np 

date1=pd.to_datetime('2016-12-1') 
date2=pd.to_datetime('2016-5-27') 

print((date1-date2)/np.timedelta64(1,'D')) 
+0

月是不是一个标准的单位。如果你假设每月30天,你可以这样做'(date1 - date2).days/30' – ayhan

+0

你所有的日期是在同一年吗? – doctorlove

+0

我的日期是不同的年份,我在想如果有一个相当于'datediff(月,日期1,日期2)的SQL' – unclegood

回答

5

您可以转换的日期个月期然后做减法:

date1.to_period("M") - date2.to_period("M") 
# 7 
+0

这是否适用于列?我用上面的2列在我的数据帧,并得到了以下错误AttributeError的:“索引”对象有没有属性“to_period” – unclegood

+1

这并不适用于列,但你需要确保这些列的datetime型的,首先,如果不,使用'pd.to_datetime()'进行转换。另外,处理日期时间列(需要'.dt'访问器)的方式与日期时间索引不同。 – Psidom

+0

是的,它工作后,我添加.dt,谢谢! – unclegood

2

如果你不关心的一个月内的日子,你可以这样做:

在同一个月内,例如
date1.year * 12 + date1.month - (date2.year * 12 + date2.month) 

日期“2016年12月31日”和“2016年12月1日”,会给你0

如果你想占个月内的一天,你可以计算出经过一个月的分数,直到给定天。例如。如果一个月有30天,那么第一天的分数是0/30,而最后一天的分数是29/30。 该代码段将做到这一点:

from calendar import monthrange 

def get_frac_of_month(date): 
    # monthrange returns a tuple where the second entry is the number of days in the month 
    return 1. * (date.day - 1)/monthrange(date.year, date.month)[1] 

def get_month_diff(date1, date2): 
    return date1.year * 12 + date1.month + get_frac_of_month(date1) - (date2.year * 12 + date2.month + get_frac_of_month(date2)) 

print get_month_diff(date1, date2) 

的输出中会

6.16129032258